Отсоединить (переместить) подкаталог в отдельный Git-репозиторий - PullRequest
1673 голосов
/ 11 декабря 2008

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

Как я могу сделать это, сохраняя историю файлов в подкаталоге?

Полагаю, я мог бы сделать клон и удалить ненужные части каждого клона, но, полагаю, это дало бы мне полное дерево при проверке более старой ревизии и т. Д. Это может быть приемлемо, но я предпочел бы иметь возможность притвориться, что два хранилища не имеют общей истории.

Просто чтобы прояснить, у меня есть следующая структура:

XYZ/
    .git/
    XY1/
    ABC/
    XY2/

Но я бы хотел вместо этого:

XYZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/

Ответы [ 24 ]

1 голос
/ 30 марта 2013

Поместите это в ваш gitconfig:

reduce-to-subfolder = !sh -c 'git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter cookbooks/unicorn HEAD && git reset --hard && git for-each-ref refs/original/ | cut -f 2 | xargs -n 1 git update-ref -d && git reflog expire --expire=now --all && git gc --aggressive --prune=now && git remote rm origin'
1 голос
/ 10 февраля 2016

Я уверен, что с поддеревом git все в порядке, но мои подкаталоги управляемого кода git, которые я хотел переместить, были в затмении. Так что если вы используете egit, это больно легко. Возьмите проект, который вы хотите переместить, и объедините его в команду> отключите его, а затем объедините команду> поделиться им в новом месте. По умолчанию будет пытаться использовать старое место репо, но вы можете снять отметку с уже существующего выбора и выбрать новое место для его перемещения. Всем привет.

0 голосов
/ 28 марта 2019

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

1) Клонируйте репозиторий, который вы хотите разбить

git clone git@git.thehost.io:testrepo/test.git

2) Переместить в папку git

cd test/

2) Удалите ненужные папки и зафиксируйте его

rm -r ABC/
git add .
enter code here
git commit -m 'Remove ABC'

3) Удалите ненужные истории форм папок с помощью BFG

cd ..
java -jar bfg.jar --delete-folders "{ABC}" test
cd test/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

для нескольких папок вы можете использовать запятую

java -jar bfg.jar --delete-folders "{ABC1,ABC2}" metric.git

4) Убедитесь, что в истории нет файлов / папок, которые вы только что удалили

git log --diff-filter=D --summary | grep delete

5) Теперь у вас есть чистый репозиторий без ABC, так что просто вставьте его в новое происхождение

remote add origin git@github.com:username/new_repo
git push -u origin master

Вот и все. Вы можете повторить шаги, чтобы получить другой репозиторий,

просто удалите XY1, XY2 и переименуйте XYZ -> ABC на шаге 3

0 голосов
/ 10 января 2019

Вы можете легко попробовать https://help.github.com/enterprise/2.15/user/articles/splitting-a-subfolder-out-into-a-new-repository/

Это сработало для меня. Проблемы, с которыми я столкнулся в приведенных выше шагах:

  1. в этой команде git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME BRANCH-NAME является master

  2. если последний шаг завершился неудачей при фиксации из-за проблемы защиты, выполните - https://docs.gitlab.com/ee/user/project/protected_branches.html

...