2017-10-06 107 views
0

想象一下你在git仓库中有两个文件,比如说A.txtB.txtgit将两个文件合并成一个历史保存的文件

是否有可能将两个文件连接成第三个文件A+B.txt,删除原始的A.txtB.txt并提交它们,所以历史记录仍然保留?

也就是说,如果我询问git log --follow A+B.txt,我会知道内容来源于A.txtB.txt文件?

我试图将文件分成两个不同的分支,然后将它们合并为一个新文件(同时删除旧文件),但无济于事。

+0

你可以尝试重新命名'A.txt'到'A + B.txt',加上从'B.txt'更改并删除'B.txt' ,然后提交。 – Derek

+1

当你使A + B.txt变成A.txt和B.txt的连接时,为什么不把它放在提交信息中。 – 2017-10-06 18:26:38

回答

2

简短的回答是“否”(甚至可能是Mu)。

历史在Git中,提交集合。没有“文件历史”这样的事情:你有一个提交,或者你没有,并且该提交有一个或多个父母,或者它没有。这意味着“档案历史”不存在 - 但是,存在git log --follow。这是自相矛盾的:如果文件历史不存在,git log --follow如何产生文件历史记录?

答案是git log --follow作弊。它没有真正找到文件历史记录。它通过历史记录查看,通过更改正在查找的文件的(单个)名称来构建子历史记录。它一次一个查看每个提交,并针对其父对象提交该提交的(加速的,有限的)git diff --find-renames。 如果diff说,在父文件X.txt更名为A.txt的孩子,你正在运行git log --follow A.txt,在git log代码现在开始寻找X.txt

由于没有代码可以一次开始查找多个文件,因此无法获得此特定作弊以适应您希望的情况,即从查找某个特定文件到查找多个文件文件。 (其实这里有两个问题,一个是由于内部实现相当有限, git log --follow一次只能查看一个文件,另一个是重命名检测不包括“联合检测”:有一种“分割检测”的形式,其中Git将执行复制查找功能,启用--find-copies--find-copies-harder。后者是非常计算密集型的,并且两者都在错误的方向工作,虽然它可以做正确的简单地通过反转的diff命令的事情。)


作为这意味着,--follow不会在合并的diff模样,至少在默认情况下。另见`git log --follow --graph` skips commits

又名 “俗气黑客”

相关问题