И, конечно
("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
, различная оптимизация уровня ассемблера была доступна, и снова разработчик должен был сделать ее явной, потому что компилятор не распознал его. (Позже компиляторы делают, таким образом, те синтаксисы являются в основном ненужными в эти дни)
Я не думаю, что это можно сделать с помощью слияния как такового, но эти шаги могут помочь, по крайней мере, в том, что касается конечного продукта. Во-первых:
% 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 для извлеченной фиксации и перезаписывает то, что находится в рабочем дереве. Затем вы можете зафиксировать эти изменения в своем локальном репозитории, как обычно. Результирующий коммит не будет иметь никакой ссылки на то, откуда он был взят, но он должен, по крайней мере, получить ваш репозиторий с версиями файлов, которые вам нужны.
Редактировать: Мне пришло в голову, что вы можете сделать это только с помощью 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
.
Попробуйте использовать для этого поддерево git . Он позволяет вам извлечь поддерево проекта в другой проект, который затем можно объединить со своим.