Первая часть вопроса:
Как отсоединить один из подкаталогов, скажем, dir1, и добавить его в другой репозиторий в качестве отдельной ветви (с историей)?
git checkout -b tempBranch
git filter-branch --subdirectory-filter dir1 --prune-empty
Во втором хранилище:
git remote add filtered_dir1 ../original_repo
git fetch filtered_dir1
git merge filtered_dir1/tempBranch
Вторая часть вопроса:
Во-вторых, как я могу удалить историюотдельный дочерний каталог из репозитория?
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch dir1" --prune-empty
Может произойти сбой с предупреждением о невозможности сделать резервную копию;Я не уверен, о чем идет речь, но добавление -f
заставит git-filter-branch
работать в любом случае.
Это будет работать только в текущей ветке .Если вы хотите запустить его на всех ветвях , добавьте -- --all
.Обратите внимание на -- --all
.
Некоторые примечания:
При запуске git filter-branch
вы будете фильтровать ветку, в которой находитесь.(Скорее всего, если вы думаете об этом).Если вы пытаетесь извлечь какую-то историю, чтобы протолкнуть ее во второй репозиторий, вы, вероятно, захотите git filter-branch
в новой ветке , чтобы исходный репозиторий ничего не потерял.
Этот вопрос содержит полезную информацию.
git filter-branch --subdirectory-filter
сделает subdirectory
новым корневым каталогом ветви - он будет перемещать файлы из subdirectory
в /
.Чтобы это исправить, в нижней части раздела EXAMPLES
приведен пример из man git-filter-branch
:
Чтобы переместить все дерево в подкаталог или удалить его оттуда:
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD