如何防止签入的文件覆盖本地版本?

问题描述:

我有一些特定于平台的修改来检入文件。当我从远程分支合并时,如何强制git保留本地版本并忽略远程版本?基本上,就像git-ignore一样,但对于已经由存储库跟踪的文件。如何防止签入的文件覆盖本地版本?

用例是我推送到一个分支,然后将这个分支在不同的平台上进行测试。首次在每个平台上进行测试需要运行./configure脚本,该脚本使用平台特定的自定义修改了某些文件。由于这些更改是自动生成的,因此我不想将它们提交到历史记录中。通常我会将这些文件添加到.gitignore,但是,其中一些文件是原始存储库的一部分,因此忽略git忽略。

+0

会把它们放在你的git排除文件('.git/info/exclude')中为你的用例工作吗? –

+0

是否阻止签入的文件覆盖本地版本? –

+0

只有当你修改了/生成的文件时才会这样做。如果你想跟踪它们,'skip-worktree'标志可能会有所帮助。查看此答案及其链接的参考资料。 http://*.com/a/13631525/149428 –

这可能是git pull keeping local changes的重复,因为如果特定于平台的更改不会被提交,那么第一个答案似乎是最好的解决方案。

+0

感谢您的指针,这是一个很好的解决方案 –

+0

顺便说一句,如果你碰巧在Mac,这个('git stash && git pull && git stash pop')是Tower在你拉动时对你的上演和未上演的变化所做的。 –

+0

@tedmiston你怎么知道塔是做什么的?我试图找出如何看到塔命令日志没有运气 –

这里有一个可能的解决方案。

假设原来的HEAD之前git merge是A合并后,运行git checkout A -- path_of_the_file_you_want_to_keep,其恢复文件A.

的地位,但这个使工作树不洁。如果您运行git status,则会在索引中找到更改的文件。我认为这是不可避免的,除非你再次提交。

由于原始HEAD由git中的变量ORIG_HEAD引用,因此无论A的实际sha1如何,始终可以运行git checkout ORIG_HEAD -- path_of_the_file_you_want_to_keep

+0

我是否需要提交在执行./configure之前发生的所有平台特定修改,然后才能检出这些文件? –

+0

我不清楚你的需求,但我认为这取决于。您可以提交任何要保留和恢复的更改。 – ElpieKay

不检查它们。使用不同的名称检入模板,并忽略活动文件的名称。

如果您的项目需要一个名为(例如)config.txt的文件,请将该文件名放在.gitignore中,并将名称不同的文件(如config.sample.txt)检入存储库。如果你想变得有趣,你可以让你的应用程序自动将文件从config.sample.txt复制到config.txt,如果该文件还不存在。

+0

我正在分叉现有的项目,并且这些文件已经签入。它们正在通过./configure脚本进行修改,因此大概需要在那里有 –

+0

因此'git mv'文件从它的当前名称到新的名称,并修改'configure'脚本来复制文件,就像我在我的答案中所解释的那样。 – duskwuff

+0

这是[配置脚本](https://github.com/tensorflow/tensorflow/blob/14ac2235699509f512b44b71160239c153ab413d/configure)btw –