2013-08-01 51 views
1

我們目前在我們的組織中使用TFS,但正在研究TFS 2013的內置Git支持。我想將TFS中的一個現有分支及其所有歷史記錄在Git中分別命名爲子文件夾(是的,我意識到爲每個分支創建單獨的Git回購會更好,但「出於某些原因」我不能那麼做吧)。將現有的Git回購合併到具有完整歷史記錄的子樹中(不壓縮)

因此,我使用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 mergeoldtfs拉入提交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的第二個分支中。與以前相同的問題:我的導入提交不在子目錄中。

那麼我對rebase的理解不正確,還是僅僅是子樹合併和子樹腳本與它不兼容?

我的下一個做法是將要嘗試過濾分支改寫進口或重訂(同樣,oldtfs將永遠不會被分享/上傳它符合其進口的目的後)前oldtfs。這是最好的選擇嗎?

(我想「得到這個權利」的原因是我想爲部門中的其他人發佈可重複的配方或腳本以類似的方式使用)。

+0

好吧...所以在看了一下發生了什麼的圖形表示後,我認爲這是有道理的。即使我拉入子樹,它們也沒有共同的祖先。如果我回去從最初的「oldtfs」提交創建分支,我認爲它會起作用。假設它,我會在兩天內自己回答這個問題...... –

+0

畢竟,這實際上似乎與缺乏共同的祖先有任何關係。見下面的答案。 –

回答

0

所以最後我確實使用了篩選分支命令;因爲我不會在任何地方推動「預先重寫的」歷史,它不會對未來的合併造成任何問題。這是TFS Git視圖以及其他圖形歷史記錄工具(如TortoiseGit)從導入文件夾的子目錄中顯示我以前的所有歷史記錄的唯一方法。

這是不是亂,因爲我認爲這將是因爲我可以使用,而不是--tree過濾--index過濾子命令。該手冊頁甚至有一個如何做的例子:

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 
相關問題