如何使git忽略特定文件的冲突和差异?

3
我们有一个自动生成的JavaScript文件,它被跟踪在我们的Git存储库中。问题是它包含了一个(无用的)时间戳注释,这经常给我们带来微不足道的合并冲突。我想避免这些冲突。
我曾经找到了一个使用.gitattributes和filter/smudge解决方案。我按照以下方式设置,以便在提交或检出时从文件中删除此时间戳行:
.gitattributes:
<the file>.js filter=tsfilter
<the file>.js smudge=tsfilter

.git/config:

[filter "tsfilter"]
      clean = perl -pe \"s/\\/\\/.*<the pattern>.*$//\"
      smudge = perl -pe \"s/\\/\\/.*<the pattern>.*$//\"

虽然这样似乎消除了合并冲突,但又引入了另一个烦恼,即该文件现在保持不断修改的状态。也就是说,“status”仍显示它已被修改,因为本地(未经过滤的)副本包括时间戳行(但提交的文件不包括该行)。
有没有更好的方法可以避免合并冲突,同时隐藏对文件此部分的本地更改呢?

1
如果它是自动生成的,为什么你需要跟踪它呢? - Neil
这是由Eclipse插件自动生成的。如果可以在命令行中完成,那么我们或许可以将其移除。 - John Lehmann
2个回答

3
我可能错误地理解了你的问题,但听起来你可以使用ourstheirs合并策略来处理相关文件。根据这个问题的答案,你可以按照以下步骤进行操作:

.gitattributes:

file.js merge=ours

.git/config:

[merge "ours"]
    name = Keep my file
    driver = true

这将始终保留您文件的版本。

theirs合并略微更加困难-- 您不能仅仅将驱动程序更改为false,您需要定义一个脚本来保持他们的更改。以上链接讨论了更多关于theirs策略的详细信息。


虽然这行代码并不重要,但文件的其他部分可能有我们和他们的独特贡献。由于这个文件只由开发人员生成,合并操作需要保留这些差异。 - John Lehmann
这也是您可以用来重新生成文件的策略。true实际上只是一个shell脚本,因此如果您能够确定一种从命令行运行文件生成的方法,这是一种可能的实现方法。 - cjc343

1
您可以修改生成该文件的程序,以不包括时间戳,或编写一个包装器来删除时间戳。

不幸的是,那个程序是一个 Eclipse 插件,我们目前并没有自己构建它,所以我不确定这会很容易。 - John Lehmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接