Создайте новый git-репо из подкаталога уже существующего репо - PullRequest
11 голосов
/ 13 июля 2011

Я хочу создать отдельный репо из подпапки уже существующего репо.

Отсоединить (переместить) подкаталог в отдельный репозиторий Git показывает именно это.НО я не могу получить чистый репо с этим.У меня две проблемы с новым репо:

  1. История кажется дублированной;
  2. Я не могу сохранить историю ветвей.

Здесьвот что я сделал:

$ git clone ssh://.../repo.git
$ cd repo
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune

После этого, похоже, у меня есть оригинальная история репо И новая история.Я набираю «git log - all --graph» (или gitk --all) и вижу в качестве первого коммита начальный коммит первого репо.Затем на графике отображается полная история исходного репо до последнего коммита.Затем у меня есть ВТОРАЯ история поверх первой, показывающая историю только той подпапки, которую я хочу.Но в этой части истории у меня есть только "master" и нет веток / слияний.

"git log", gitk или gitg показывают только историю "flatten": они не показывают исходный репоистория до сплющенной истории подпапки.

Я пытался использовать только команду "filter-branch", клонируя получившийся репозиторий (с --no-hardlinks), используя:

$ git filter-branch --subdirectory-filter subdirectory -- --all

вместо:

$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all

Но с тем же результатом.

Я делаю что-то не так или git не работает?У меня действительно нет идей ... Использование git 1.7.6.Спасибо.

РЕДАКТИРОВАТЬ: Я думаю, что проблема может быть из-за того, что коммиты слияния игнорируются фильтром ветвления, таким образом, давая ровную историю без ветвей или слияний ...

Ответы [ 4 ]

4 голосов
/ 14 июля 2011

У вас есть две проблемы:

(1) Как указывает Кевин Баллард, вам нужно удалить каталог refs / original в вашем каталоге .git, чтобы избавиться от ложных записей журнала;IIRC это упоминается в вопросе, на который вы ссылались.

(2) Вы должны конвертировать ветви по одной за раз.Насколько я знаю, это нигде не упоминается, но это довольно легко обнаружить эмпирически.Сценарий для этого будет выглядеть примерно так:

for branch in $(git for-each-ref --format='%(refname:short)' refs/remotes/origin | grep -v HEAD); do
  git checkout -b $(basename $branch) $branch
  git filter-branch -f --subdirectory-filter subdirectory HEAD -- --all
done

Обратите внимание, что вам нужно -f или что-то вроде --original $ (basename $ branch) -original, чтобы заставить git повторно использовать или переименовыватьпространство имен, где хранятся исходные ссылки.Также обратите внимание, что вы можете увидеть сообщения типа «Ничего не найдено для перезаписи», если подкаталог не существует в конкретной ветви - возможно, вы захотите удалить эти ветви из вашего нового репозитория.(Или удалите их перед запуском скрипта.)

2 голосов
/ 09 мая 2014

Github имеет прямой метод:

https://help.github.com/articles/splitting-a-subpath-out-into-a-new-repository

git clone git://github.com/defunkt/github-gem.git

cd github-gem/ Изменить каталог в хранилище

git filter-branch --prune-empty --subdirectory-filter lib master

1 голос
/ 18 ноября 2011

Я думаю, вам нужно удалить свои пульты. например,

git remote rm origin

Я думал то же самое, что и вы, когда я запускал git log --all и gitk --all и видел все коммиты. Затем я понял, что дополнительные коммиты были с пульта.

0 голосов
/ 14 июля 2011

git filter-branch сохраняет все исходные ссылки в свое собственное пространство имен (под original/).Похоже, ваши git log --all тоже показывают эти ссылки.Вместо этого вы должны проверить все ссылки, которые вас интересуют, и если они выглядят хорошо, вы можете выбросить пространство имен original/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...