2013-05-06 100 views
4

我嘗試將目錄及其所有歷史記錄從存儲庫移動到另一個存儲庫。將git子樹移動到不同的存儲庫中

解壓縮目錄的完整歷史是容易git subtree split

這創建了一個新的分支,可以很容易地將其提取到其他存儲庫。

現在我用git subtree add到目錄粘貼到第二個庫。

如果我看gitkgit log --decorate --graph一切都看起來不錯。所有提交按預期呈現。所有文件也按預期呈現。

但是,當我嘗試使用git log -- transplanted_dir/somefile查看移植文件的歷史記錄時,我只看到git subtree add產生的一個「合併」提交。

爲什麼我看到上面gitk的提交,而不是在日誌中的單個文件?

如果我做一個簡單git merge,我可以看到每個文件的歷史記錄,但這些文件會,當然不是生活在一個子文件夾。

將移動的提交集成到其他存儲庫的正確方法是什麼?

詳細的示例命令再現的情況:

#create two repositories: 
git init a 
git init b 

# create directory dir with some history 
cd a 
mkdir dir 
echo 1 > dir/file 
git add . 
git commit -am 1 
echo 2 > dir/file 
git commit -am 2 
echo 3 > dir/file 
echo 3 > otherfile 
git add . 
git commit -am 3 

#split subtree 
git subtree split --prefix dir -b split 

#create a commit on repo b 
cd ../b 
mkdir otherdir 
touch otherdir/file 
git add . 
git commit -am init 

#fetch split branch of repo a 
git fetch ../a split 
git co -b split FETCH_HEAD 
git log --decorate --graph --name-status 
git co master 

# add commits to repo b 
git subtree add --prefix somedir split 

# this looks fine: 
git log --decorate --graph --name-status 

# no history here - Why? 
git log --decorate --graph --name-status somedir/file 
git log --decorate --graph --name-status --follow somedir/file 
+0

當您移動文件時,您將其重命名。我很確定沒有參數的'git log'只是在重命名時停止;在更早的時候,該文件不存在。 – matt 2013-05-06 17:08:21

+0

不,沒有重命名。 「合併」提交只是添加新文件。 – michas 2013-05-06 18:09:02

+0

@michas將'foo/bar/baz'移動到'bar/baz'屬於重命名。 'git log --follow'的輸出是什麼? – gcbenison 2013-05-06 18:25:55

回答

2

好的,讀取源清零東西。

git subtree add是相當難看:它首先使用git read-tree任何歷史添加當前版本沒有到指定目錄。之後,它使用git commit-tree創建假合併提交,以附加包含前綴不完整的文件的舊歷史記錄。另一方面,現在HEAD前綴文件和HEAD^2中前綴不變的文件應該完全相同,並且應該被--follow識別爲移動。

不幸的是它不被認可。不知道爲什麼。

最好的解決辦法可能是添加一個明確的提交文件移動到新的目錄,做一個正常的合併。 - 另一種方法是按照How can I rewrite history so that all files, except the ones I already moved, are in a subdirectory?中所述重寫移植目錄的歷史記錄。

對於我的情況git subtree add是壞的,正常準備好的子樹正常git merge似乎是正確的事情。

+0

這裏有一個非常類似的問題:http:// stackoverflow。com/questions/10918244/git-subtree-without-squash-view-log – LopSae 2013-05-07 17:54:36

+0

如果我有一個通過'git subtree add'創建的存儲庫,是否有辦法恢復歷史記錄以便'git log'正常工作? – oconnor0 2013-05-16 22:14:56

+0

「準備好的子樹」是什麼意思?您能否將命令/更改添加到您的問題中的命令中? – 2014-07-01 08:56:44

相關問題