2010-10-08 212 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