Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git Can';t更换参考文件“;永久性;_Git - Fatal编程技术网

Git Can';t更换参考文件“;永久性;

Git Can';t更换参考文件“;永久性;,git,Git,我不得不将两个分支合并成另一个分支,我想捕捉/记录这段历史。首先,我尝试了一个八达通合并,但是分支太不同了,Git拒绝执行合并。需要明确的是,这涉及到三个分支,而不是两个 另一种选择是,我从每个分支签出所需的文件,对每组文件进行三向差异,然后提交。为了记录历史,我使用了git replace--graft。除了必须在没有Git的情况下处理合并之外(除了跟踪其他分支中的文件……这是一件大事),它进行得很顺利 然后我发现这个新的提交并不是分支本身的一部分,而是在有东西调用它时用它来代替实际的提交。这

我不得不将两个分支合并成另一个分支,我想捕捉/记录这段历史。首先,我尝试了一个八达通合并,但是分支太不同了,Git拒绝执行合并。需要明确的是,这涉及到三个分支,而不是两个

另一种选择是,我从每个分支签出所需的文件,对每组文件进行三向差异,然后提交。为了记录历史,我使用了
git replace--graft
。除了必须在没有Git的情况下处理合并之外(除了跟踪其他分支中的文件……这是一件大事),它进行得很顺利

然后我发现这个新的提交并不是分支本身的一部分,而是在有东西调用它时用它来代替实际的提交。这是不可取的。诚然,我不知道以这种方式处理事情有什么缺点,但这并不是说没有负面影响。此外,它似乎凌乱和不恰当

查找一个解决方案,我发现
git过滤器分支--
应该都能做到这一点……但它似乎没有做到。首先,我希望至少替换提交的散列会改变。而且,我收到的错误似乎表明出了问题

Rewrite 500495d563d9209cf21d660e7d78d2a7677e570b (291/318) (6 seconds passed, remaining 0 predicted)    
WARNING: Ref 'refs/heads/cleanup
WARNING: Ref 'refs/heads/planning' is unchanged
WARNING: Ref 'refs/heads/devel' is unchanged
WARNING: Ref 'refs/remotes/nm/cleanup
WARNING: Ref 'refs/remotes/nm/planning' is unchanged
WARNING: Ref 'refs/remotes/nm/devel' is unchanged
WARNING: Ref 'refs/replace/3ec2686d2ae2ba9e7583836e26e25c7bd0b8aa19' is unchanged
WARNING: Ref 'refs/tags/sent/18-01-11' is unchanged
WARNING: Ref 'refs/tags/sent/18-02-11' is unchanged
WARNING: Ref 'refs/tags/sent/18-10-23' is unchanged
WARNING: Ref 'refs/tags/sent/18-10-24' is unchanged
WARNING: Ref 'refs/tags/sent/18-12-27' is unchanged
WARNING: Ref 'refs/tags/sent/18-12-31' is unchanged
接下来的问题是“我还能怎么做呢”、“确实出了什么问题了吗”和/或“我怎么才能‘修复’这个问题?”我理解
git graft
是处理第一步的另一种方法,但(1)它似乎是一种骇人听闻的黑客破解解决方案,我已经阅读了它的建议和(2)我在
git-graft
上找不到文档,这让我相信它已经被删除,取而代之的是
git-replace-graft


如果这很重要,我在运行
git过滤器分支
之前已经运行了
git gc
。事实上,我在上周早些时候执行了git replace的
part,只是觉得今天“巩固”提交可能是个好主意。

很抱歉问这个非常基本的问题,但是。。。你想达到什么目标?将两个分支合并在一起会记录双亲的历史。还有,为什么章鱼会合并为两个分支?oO为什么经典合并不符合您的需要?我正在将两个分支合并为另一个分支,因此涉及三个分支。谢谢你指出这一点,我会澄清的。如果你有gc'ed,裁判都已经打包好了。最好避免直接检查
.git/refs
;对每个ref使用
git
。我需要做一些实验,或者研究shell脚本,看看过滤器分支如何处理实际的refs/replace/references本身,但一般来说,当它复制它可以从
--all
获得的所有提交时,它会在不禁用替换的情况下读取源提交,因此,如果它请求提交
a123456…
,并被
b789abc…
替换,它将复制
b789abc…
而不是
a123456…
。这就是“固定”替换的原因。如果您有一堆现有分支和标记,它们的tip提交不受复制过程的影响(因为复制的提交在整个复制过程中都与原始提交完全相同=>所有副本都是原始的),对于每个这样的引用,您都会得到上面的
警告
s。因此,至少这部分看起来是正常的。不,
git gc
只是运行
git pack refs
git pack refs
删除引用文件,并用引用数据库替换它们。这就是你找不到这些文件的原因,它们在(平面文本文件)数据库中。使用
git for each ref
git update ref
访问引用,不要查找文件。