如何在git中处理跟踪生成的文件?

17

背景:

我们在系统中生成了需要以最终状态提交的文件(例如,我们不能依赖源(未生成的)文件并动态生成已生成的文件)。由于需要这些生成的文件,因此它们不能被git忽略。

问题:

这些文件会在执行checkout和pull命令时触发很多“Your local changes to the following files would be overwritten by merge”错误。

当我执行pull或checkout时,我从不关心我的文件是什么,我只关心新文件。 (显然,我非常关心生成文件的源文件。我希望对源文件进行合并警告,源文件存储在不同的目录中。)

但是,在提交时,我希望我的版本“获胜”,并且将提交生成的文件。

可能的解决方案:

现在,我只需运行git checkout -- generated-files/即可在拉取或checkout之前重置我的生成文件并跳过任何合并错误。它有效,但我经常忘记执行它,如果可能的话,我想自动化它。

我研究了pre-checkout和pre-pull钩子,但git不提供它们:(

问题:

  • 有没有更好的方法来处理生成的文件?
  • 有没有一种方法可以在执行pull或checkout之前强制运行git checkout -- generated-files/
  • 你如何处理git中的生成文件?

假如你执行 git stash,然后进行 pull 操作,最后再执行 pop,这样就可以保留你的更改。 - BatScream
如果两个分支都对生成的文件进行了更改,保留其中任何一个分支都是不正确的。您应该在解决其他文件中的冲突后执行生成,然后将结果记录为合并版本。 - max630
2个回答

11
我的个人信条是:如果文件可以生成,只有能够生成它的部分才应该在源代码控制之下。否则,你将遭受你现在遇到的许多噪音。
如果生成的文件是一个真正的、经常出现的、可重复的步骤,并且是你的构建链的一部分,那么把它们所在的目录添加到你的.gitignore文件中是安全的(不要忘记用git rm --cached命令删除文件夹,这样它们就不会被跟踪了)。
如果生成的文件是实际源代码的一部分,那么团队成员和/或领导之间应该进行一次对话,并讨论为什么这些文件处于版本控制之下,如果它们的生成是自动化的。可能有合法的理由来跟踪它们,也可能没有——至少值得提问。
我的建议是忽略任何已生成的文件,并将它们保持在Git之外。但是,你需要与你的队友交流,看看是否每个人都想遵循这个惯例。

3
有一次,我不得不提交生成的文件,因为生成它们需要安装到所有目标系统上的软件,而我无法这样做。我提交了这些文件,但同时添加了原始文件的校验和。这样,如果有人更改了原始文件而没有更新生成的文件,就会导致构建错误。 - max630
4
回到现实世界,这并非总是可能的。有很多不好的原因。 - Tuntable
2
generated-file -merge -diff添加到.gitattributes中是否有帮助,这样你至少可以避免在这些文件中出现合并冲突? - Hjulle

-2

对被接受的答案的评论:

这个默认赋值可能会因为通配符而导致拒绝服务攻击。请加上引号。有问题的代码:

: ${COLUMNS:=80}

正确的代码:

: "${COLUMNS:=80}"

参考资料:https://github.com/koalaman/shellcheck/wiki/SC2223


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