отсоединить подкаталог репо и сделать его веткой другого репо? - PullRequest
1 голос
/ 01 марта 2012

У меня есть git-репо, скажем, repoA, со множеством подкаталогов. Как я могу отсоединить один из подкаталогов, скажем, dir1, и добавить его в другое хранилище в виде отдельной ветки (с историей)?

Во-вторых, как я могу удалить историю отсоединенного subdir из repoA?

1 Ответ

1 голос
/ 02 марта 2012

Первая часть вопроса:

Как отсоединить один из подкаталогов, скажем, 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.

Некоторые примечания:

  1. При запуске git filter-branch вы будете фильтровать ветку, в которой находитесь.(Скорее всего, если вы думаете об этом).Если вы пытаетесь извлечь какую-то историю, чтобы протолкнуть ее во второй репозиторий, вы, вероятно, захотите git filter-branch в новой ветке , чтобы исходный репозиторий ничего не потерял.

  2. Этот вопрос содержит полезную информацию.

  3. 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
    
...