мерзавец: могу я слияние поддерева просто подпуть репозитория?

И, конечно

 ("ABCD"[2] == 2["ABCD"]) && (2["ABCD"] == 'C') && ("ABCD"[2] == 'C')

главная причина для этого состояла в том, что назад в 70-х, когда C был разработан, компьютеры не имели большой памяти (64 КБ был много), таким образом, компилятор C не сделал большой проверки синтаксиса. Следовательно" X[Y]" был скорее вслепую переведен в" *(X+Y)",

Это также объясняет" +=" и" ++" синтаксисы. Все в форме" A = B + C" имело ту же скомпилированную форму. Но, если B был тем же объектом как A, то оптимизация уровня ассемблера была доступна. Но компилятор не был достаточно ярок для распознавания его, таким образом, разработчик имел к (A += C). Точно так же, если C был 1, различная оптимизация уровня ассемблера была доступна, и снова разработчик должен был сделать ее явной, потому что компилятор не распознал его. (Позже компиляторы делают, таким образом, те синтаксисы являются в основном ненужными в эти дни)

14
задан Carl Manaster 16 July 2012 в 17:11
поделиться

3 ответа

Я не думаю, что это можно сделать с помощью слияния как такового, но эти шаги могут помочь, по крайней мере, в том, что касается конечного продукта. Во-первых:

% git fetch Bar

Это извлекает последние фиксации из репозитория Bar, но не пытается их объединить. Он записывает SHA для фиксации в .git / FETCH_HEAD

% cat .git/FETCH_HEAD
b91040363160aab4b5dd46e61e42092db74b65b7                branch 'Bar' of ssh://blah...

Это показывает, какой идентификатор SHA для последней фиксации из удаленной ветки.

% git checkout b91040363160aab4b5dd46e61e42092db74b65b7 www/tools

Это берет копию файлов в www / tools для извлеченной фиксации и перезаписывает то, что находится в рабочем дереве. Затем вы можете зафиксировать эти изменения в своем локальном репозитории, как обычно. Результирующий коммит не будет иметь никакой ссылки на то, откуда он был взят, но он должен, по крайней мере, получить ваш репозиторий с версиями файлов, которые вам нужны.

0
ответ дан 1 December 2019 в 13:47
поделиться

Редактировать: Мне пришло в голову, что вы можете сделать это только с помощью git merge --no-commit . Это попытается выполнить слияние, и даже если оно не конфликтует, оно остановится непосредственно перед фиксацией. На этом этапе вы можете удалить весь ненужный мусор (включая восстановление конфликтующих файлов, если необходимо) и создать фиксацию слияния, содержащую только желаемое поддерево.

Исходный ответ:

Вы действительно можете использовать filter-branch для этот. Схема:

Клонируйте репозиторий исходного кода:

git clone --bare /path/to/bar /path/to/bar_clone

Использование чистого клона сэкономит вам время и пространство для создания рабочего каталога.

Затем используйте ветвь фильтра для клона:

git filter-branch --index-filter 'git rm -rf <unwanted files/directories>' -- --all

] - all сообщает ему, что вы хотите использовать все ссылки, а не только текущий HEAD. Теперь у вас будет репозиторий, содержащий только нужный подкаталог, и вся история, связанная с этим.

Примечание: Извините, я не знаю действительно простого способа удалить все, кроме того, что вы хотите. Вы должны быть осторожны с подстановочными знаками, потому что вы не хотите уничтожать любые каталоги git. Вот кое-что, что будет работать, хотя и медленнее, особенно если у вас много файлов:

git filter-branch --index-filter 'git rm -f `git ls-files | grep -v ^www/tools`' -- --all

В любом случае, как бы вы ни управляли списком удаляемых файлов, вы можете продолжить слияние поддерева, извлекая из bar_clone в foo .

2
ответ дан 1 December 2019 в 13:47
поделиться

Попробуйте использовать для этого поддерево git . Он позволяет вам извлечь поддерево проекта в другой проект, который затем можно объединить со своим.

4
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: