2010-10-08 209 views
19

我想從一個文件中取出一個函數並將其放入另一個文件中,但保留責備歷史。分割文件時保留git歷史

cp a.php b.php 

vim b.php 
# delete everything but 1 function 

vim a.php 
# delete the 1 function 

git add a.php b.php 
git commit 

但是,如果我運行git blame b.php我只看到它責怪這個新的提交。

回答

4

這或許以前的SO問題可能是信息:

How does git track source code moved between files?

套用接受的答案:基本上,Git不會實際上是「商店」移動代碼;當爲移動的代碼生成類似責任的事情時,通過檢查從提交到提交的整個存儲庫的狀態,完成事後

+0

這個答案聽起來像一個「不」,但實際上它是一個「有時」。這個刪除似乎是觸發Git查看歷史文件超出其他文件生日的原因。拆分一個函數,但保留文件的其餘部分可能不起作用。但我只是將一個文件分成兩部分,刪除原文並給出兩個新名稱,並在兩個新文件中正確分配責任。 – Potatoswatter 2012-12-18 02:49:00

+0

Woops,那是在編輯之後。承諾後,它顯然失去了其中一個新文件的責任。還有可能嗎? – Potatoswatter 2012-12-18 03:01:08

5

嘗試git blame -C -C b.php

+0

我希望歷史可以歸咎於較舊的提交。我們使用git-svn,所以其他人將在svn上。 – 2010-10-08 04:46:26

+0

太糟糕了。 SVN根本不支持這一點! – Arafangion 2010-10-08 04:56:25

+0

超級有用,tx ..還沒有設法找到'git log'的解決方案 – ptim 2017-07-07 07:09:15

13

保持怪歷史的一般規則是讓一個單獨的舉動第一次提交任何編輯之前。根據我的經驗,這允許git blame工作,而不需要-C選項。

  1. 複製原新目的地,一定要刪除原有的
  2. 從刪除多餘的部分:因此,在分割文件成新文件的情況下,這可以在兩次提交完成重複的文件

在提供的例子,這將是:

cp a.php b.php 
mv a.php c.php 
git add a.php b.php c.php 
git commit 
vim b.php # delete everything but 1 function 
vim c.php # delete the 1 function 
git add b.php c.php 
git commit 
+0

git add在一個不存在的文件上的行爲在Git 1.9的某個時候發生了變化。您需要'git rm'或'git add -A'來反映已刪除的文件。 – 2016-06-25 00:35:30

+0

感謝評論@DamianYerrick。如果你指定確切的文件來分階段的話,我不相信它應該是重要的。 (變化是,從git 2.0開始,「git add '與'git add -A ''相同,因爲它包含根據[發行說明](https://git.kernel)的刪除。組織/ CGIT/GIT中/ git.git /純/文檔/ relnotes的/ 2.0.0.txt))。 – vine77 2016-06-27 18:37:29