我想从一个文件中取出一个函数并将其放入另一个文件中,但保留责备历史。分割文件时保留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
我只看到它责怪这个新的提交。
我想从一个文件中取出一个函数并将其放入另一个文件中,但保留责备历史。分割文件时保留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
我只看到它责怪这个新的提交。
这或许以前的SO问题可能是信息:
How does git track source code moved between files?
套用接受的答案:基本上,Git不会实际上是“商店”移动代码;当为移动的代码生成类似责任的事情时,通过检查从提交到提交的整个存储库的状态,完成事后。
尝试git blame -C -C b.php
我希望历史可以归咎于较旧的提交。我们使用git-svn,所以其他人将在svn上。 – 2010-10-08 04:46:26
太糟糕了。 SVN根本不支持这一点! – Arafangion 2010-10-08 04:56:25
超级有用,tx ..还没有设法找到'git log'的解决方案 – ptim 2017-07-07 07:09:15
保持怪历史的一般规则是让一个单独的举动第一次提交任何编辑之前。根据我的经验,这允许git blame
工作,而不需要-C
选项。
在提供的例子,这将是:
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
git add在一个不存在的文件上的行为在Git 1.9的某个时候发生了变化。您需要'git rm'或'git add -A'来反映已删除的文件。 – 2016-06-25 00:35:30
感谢评论@DamianYerrick。如果你指定确切的文件来分阶段的话,我不相信它应该是重要的。 (变化是,从git 2.0开始,“git add
这个答案听起来像一个“不”,但实际上它是一个“有时”。这个删除似乎是触发Git查看历史文件超出其他文件生日的原因。拆分一个函数,但保留文件的其余部分可能不起作用。但我只是将一个文件分成两部分,删除原文并给出两个新名称,并在两个新文件中正确分配责任。 – Potatoswatter 2012-12-18 02:49:00
Woops,那是在编辑之后。承诺后,它显然失去了其中一个新文件的责任。还有可能吗? – Potatoswatter 2012-12-18 03:01:08