В настоящее время мы используем 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 никогда не будет совместно/загружался после он служит своей цели импорта). Это лучший вариант здесь?
(Причина, по которой я хочу «получить это право», заключается в том, что я хочу опубликовать повторяемый рецепт или скрипт для других в отделе, которые будут использоваться аналогичным образом).
Хорошо, поэтому, посмотрев на графическое представление о том, что происходит, я думаю, что это имеет смысл. Несмотря на то, что я потянул в поддерево, у них нет общего предка. Если я вернусь и создаю ветку из первоначального «oldtfs», я думаю, что это сработает. Предполагая, что это так, я отвечу на это сам через два дня ... –
В конце концов, похоже, это не имеет ничего общего с отсутствием общего предка. См. Ответ ниже. –