2013-08-01 3 views
1

В настоящее время мы используем TFS в нашей организации, но изучаем встроенную поддержку Git TFS 2013. Я хотел бы вытащить существующую ветку из TFS со всей ее историей в другую подпапку в Git (да, я понимаю, что создание отдельного Git-репо для каждого будет лучше, но «по причинам» я не могу сделайте это еще).Вытяните существующий Git repo в поддерево с полной историей (без раздавливания)

Поэтому я использовал git-tfs, чтобы клонировать историю TFS в новое репо. Ни одна из изменений Git никогда не будет возвращена в TFS, поэтому проблем нет.

git tfs init http://ExistingTfs:8080/tfs/DefaultCollection $/Path/To/Branch oldtfs 
git tfs fetch 

я затем клонировали новый репозиторий локально и добавил oldtfs в качестве пульта дистанционного управления.

git clone http://NewTfs:8080/tfs/DefaultCollection/_git/NewRepo newtfs 
git remote add oldtfs ../oldtfs 

Далее я первый попытался с помощью subtree merge тянуть коммиты из oldtfs в newtfs и совершенные на местном уровне.

git merge -s ours --no-commit oldtfs/master 
git read-tree --prefix=MyProject/MyDir/ -u oldtfs/master 
git commit -m 'import old TFS' 

Казалось, работает хорошо («Журнал мерзавец» показал всю историю в нужном месте), но когда я отодвинул до TFS, он появился как только один слияния совершить, хотя имело два родителей как я и ожидал. После немного большего чтения это звучало так, будто мне нужна перебаза.

Так что я создал две ветви в newtfs, импорт и сквош. Я выполнил слияние поддерева в импорт, а затем переустановил на сквош.

git checkout import 
[...subtree merge as above...] 
git rebase squash 

В результате этого, однако, является то, что импорт теперь имеет все оригинальные TFS совершает в корне (не/MyProject/Mydir) и сквош, кажется, не влияет.

Далее я попытался использовать новый "git subtree" script from contrib (в свежем клоне от удаленного TFS)

git subtree add -P MyProject/MyDir 

Опять же, выглядел великолепно на месте, но отодвигая на сервер TFS показал все сжато в одну поддерева совершить (но опять же с несколькими родителями).

Наконец, я попробовал поддерево git с перераспределением на вторую ветку с общим ancenstor. Такая же проблема, как и раньше: мои импортированные коммиты больше не находятся в подкаталоге.

Мое понимание неверности фальсификации, или это просто, что слияние поддерева и скрипт поддерева не совместимы с ним?

Мой следующий подход будет пытаться фильтр-ветвь переписать oldtfs перед импортом или перебазирования (опять же, oldtfs никогда не будет совместно/загружался после он служит своей цели импорта). Это лучший вариант здесь?

(Причина, по которой я хочу «получить это право», заключается в том, что я хочу опубликовать повторяемый рецепт или скрипт для других в отделе, которые будут использоваться аналогичным образом).

+0

Хорошо, поэтому, посмотрев на графическое представление о том, что происходит, я думаю, что это имеет смысл. Несмотря на то, что я потянул в поддерево, у них нет общего предка. Если я вернусь и создаю ветку из первоначального «oldtfs», я думаю, что это сработает. Предполагая, что это так, я отвечу на это сам через два дня ... –

+0

В конце концов, похоже, это не имеет ничего общего с отсутствием общего предка. См. Ответ ниже. –

ответ

0

Так что в конце концов я только что закончил использование команды filter-branch; так как я не буду толкать «предварительно перезаписанную» историю нигде, она не вызовет никаких проблем с будущими слияниями. Это был единственный способ показать TFS Git, а также другие инструменты графической истории (такие как TortoiseGit), чтобы показать всю мою предыдущую историю изнутри подкаталогов импортированной папки.

Это было не так грязно, как я думал, что это будет, так как я мог бы использовать --index Задает фильтр субкоманду вместо --tree фильтра. На странице руководства есть пример того, как это сделать:

git filter-branch --index-filter \ 
    'git ls-files -s | sed "s-\t\"*-&MyProject/MyDir/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

 Смежные вопросы

  • Нет связанных вопросов^_^