Git rebase 自动生成文件失败

Git rebase failure with auto-generated file

我正在开发一个代码库,其中一个文件是自动生成的并且更改非常频繁。我发现重新定位我的本地分支通常会导致退回到三向合并并在此文件上失败。然后我必须修复文件并继续,但这可能会在一个 rebase 中发生多次,并且由于文件的性质,手动解决冲突通常是非常讨厌的。事实上,整个过程以一团糟和完全浪费时间而告终,因为尝试合并这个特定文件没有任何附加价值。

鉴于无论如何它都是作为构建过程的一部分重新创建的,有没有办法让我告诉 Git 在变基期间忽略这个文件?

请注意,我查看了其他类似的问题/答案,但没有看到任何专门解决此问题的内容(尽管如果有问题请纠正我。)另外,郑重声明,我并不热衷于此这种文件反正在版本控制中,但恐怕我别无选择。

您可以将文件(文件名 and/or 路径)放入名为 .gitignore 的文件中 这将完全阻止 git 识别该文件。

如果该文件是由您的构建生成的,那么它首先不应受版本控制。

git rm --cached <path/to/file>
echo <path/to/file> >> .gitignore
git add .gitignore
git commit -m "Removed <path/to/file> from version control"

尽管我之前的回答仍然认为是最干净的选择,但考虑到您无法影响源文件的特殊情况,您仍然可以 git 帮助您处理始终冲突的文件控制。

您需要告诉 git 它应该始终根据特定策略解决特定文件的冲突(此处:theirs 获胜)。

git init

# Define a no-op merge driver for this repo
git config merge.theirs.driver true
# The file always-conflict is solved using the just setup 'theirs' driver
echo always-conflict merge=theirs >> .gitattributes

# Create two conflicts:
# - always-conflict is resolved automatically
# - other-conflict needs to be resolved by you
echo master-1 > always-conflict
echo master-1 > other-conflict
git add --all
git commit -m master-1

echo master-2 > always-conflict
echo master-2 > other-conflict
git add --all
git commit -m master-2

git checkout -b feature HEAD~1
echo feature > always-conflict
echo feature > other-conflict
git add --all
git commit -m feature

git rebase master

# The rebase will stop, but it'll only have you solve other-conflict.

如果您不想将 .gitattributes 文件提交给版本控制,请改用 .git/info/attributes

您可以通过将 myfile.name binary 添加到 .gitattributes 文件来告诉 git 将该特定文件视为二进制文件,其中 myfile.name 是导致您的文件的名称问题。这将告诉 git 该文件是二进制类型,不应合并。

参见:How do I make Git treat a file as binary?