在某些情况下,我正试图将我的分支机构从主人那里改掉。但是在master上做了一些更改,删除了很大一部分代码库(这很好,并且是预期和讨论过的)。现在我正在改变主人的变化,但是我发现了一些疯狂的文件冲突
CONFLICT (modify/delete): someFile.fileType deleted in HEAD and modified in added commitName. Version added commitName of someFile.fileType left in tree.
手动为10个文件做事情很好,但我有超过1000个这样的文件。我如何git rm
这些文件并继续变基?
一些额外信息:
我运行了以下命令
git rebase master
答案 0 :(得分:1)
该方法很简单,但此方法的应用程序需要一些小心,因为它可以轻松产生可怕的结果。您需要做的是确定哪些文件存在于索引的哪个阶段,然后相应地更新索引。
如你所说,你有一个:
CONFLICT (modify/delete): someFile.fileType deleted in HEAD and modified in ...
因此,您将在 base 提交中存在一个文件(在索引的第1阶段),并存在于其他提交中(索引中的第3阶段) ),但不在 HEAD 提交中(索引中的第2阶段)。该文件也将存在于工作树。
中要找出索引中的哪些文件,请在哪些阶段运行git ls-files --stage
。然后,您需要更改索引内容以解决任何冲突并确定将提交的内容。如果您希望通过删除最终提交中的文件来解决此冲突,您只需运行git rm someFile.fileType
,这将删除所有索引条目和该文件的工作树版本。
因此,作为一种非常作弊的方法,这个可以工作:
git ls-files --stage | awk $'/ 3\t/ { print $4 }' | xargs git rm
非常小心这个!如果你盲目地应用一些你不明白的食谱,你可能会烤一个有毒的蛋糕。请注意,这完全忽略了同一文件是否具有stage-2条目,并且仅查找索引中的stage-3条目。对于任何包含空格的路径名,它也行为不端,因为awk
在这里用空格进行字段分隔。
请注意,所有已解析的文件都在索引中作为阶段0,因此如果除了修改/删除之外还有任何冲突,您可以先手动解决它们,然后使用上面的命令git rm
其余的。
答案 1 :(得分:1)
大规模追溯只是任何事情都是git filter-branch
的工作。
git diff --name-only --diff-filter=D ...master
将生成一个列表,列出自您分支以来从主服务器中删除的所有文件。
wipelist=`mktemp`
git checkout -b WIP
git diff --name-only --diff-filter=D ...master >$wipelist
git filter-branch --prune-empty --index-filter "
git update-index --force-remove --stdin <$wipelist
" -- master..
现在你有一个WIP
分支,它与之前签出的分支完全相同,除了它上面没有任何文件在主分支上不再存在,WIP
上的第一个提交删除master
上随后删除的所有内容。