我们团队中的每个开发人员都有自己的本地配置。该配置信息存储在名为devtargets.rb的文件中,该文件在我们的rake构建任务中使用。我不希望开发人员破坏彼此的devtargets文件。

我首先想到的是将该文件放入.gitignore列表中,以便不提交给git。

然后我开始怀疑:是否可以提交该文件,但是忽略对文件的更改?因此,我将提交文件的默认版本,然后当开发人员在其本地计算机上对其进行更改时,git将忽略所做的更改,并且当您执行git status或git commit时,它不会显示在更改的文件列表中。

可能吗?这肯定是一个不错的功能...

评论

另请参见stackoverflow.com/questions/3318043/…关于类似主题。

提交机器特定配置文件的可能副本

git只在本地忽略文件

#1 楼

当然,我会时不时地使用
git update-index --assume-unchanged [<file> ...]

进行此操作,以撤消并重新开始跟踪(如果您忘记了未跟踪的文件,请参阅此问题):
git update-index --no-assume-unchanged [<file> ...]

相关说明文件:

-[无]假定不变
指定此标志时,不会更新为路径记录的对象名称。而是,此选项设置/取消设置路径的“假定不变”位。当“假定未更改”位打开时,用户承诺不更改文件,并允许Git假定工作树文件与索引中记录的文件匹配。如果要更改工作树文件,则需要取消设置该位以告知Git。当在lstat(2)系统调用非常慢的文件系统上处理大型项目时(例如cifs),这有时会很有帮助。
如果需要在索引中修改此文件,例如Git,Git将失败(正常)。合并提交时;因此,如果假定的未跟踪文件在上游进行了更改,则您需要手动处理这种情况。

在这种情况下,如果该文件的上游存在任何更改(合法更改,等),当您执行拉动操作时,它会显示:
$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext
 

并拒绝合并。
此时,您可以通过还原本地更改来克服此问题,这是一种方法:
 $ git checkout filename.ext

,然后再次拉动并重新修改本地文件,或者可以设置–no-assume-unchanged,然后可以进行常规的隐藏和合并等。

评论


这个命令是在.git文件夹中本地执行的吗?我的意思是,如果我对config.php文件运行此命令,此信息是否会传播到其他使用该存储库的用户?

–魔术师
2015年2月10日下午0:01

@Magus:不。这只会为您服务。

–罗布·威尔克森(Rob Wilkerson)
2015年2月10日在12:18

不久之后,您将想知道如何确定文件是否假定未更改:stackoverflow.com/questions/2363197/…

– Ciro Santilli郝海东冠状病六四事件法轮功
15年2月20日在15:52

当使用“ git stash”时,以这种方式忽略的文件更改将丢失。有办法解决吗?

– Alexis
16-10-4在10:41

这不是git update-index --assume-unchanged的目的。 public-inbox.org/git/…

–jsageryd
18年8月2日在15:30



#2 楼

执行此操作的首选方法是使用git update-index --skip-worktree <file>,如此答案中所述:


assume-unchanged设计用于检查一组文件是否包含以下内容的情况:被修改;设置该位时,git
(当然)假定与
索引的该部分相对应的文件在工作副本中尚未被修改。因此,它避免了统计调用的混乱情况。每当索引中的文件条目更改时,此位就会丢失(因此,当文件在上游更改时)。

skip-worktree不仅如此:即使git知道文件已被修改(或需要通过reset --hard或
进行修改),它会假装没有修改过,而是使用
索引中的版本。这将一直持续到丢弃索引为止。


要撤消此操作,请使用git update-index --no-skip-worktree <file>

由于git版本2.25.1,因此也不推荐使用此方法,引用:


用户经常尝试使用假设未更改和skip-worktree位来告诉Git忽略对跟踪文件的更改。这不能按预期方式工作,因为在执行某些操作时,Git可能仍会根据索引检查工作树文件。通常,Git不提供忽略跟踪文件更改的方法,因此建议使用替代解决方案。例如,如果要更改的文件是某种配置文件,则存储库可以包括一个示例配置文件,然后可以将其复制到忽略的名称中并进行修改。该存储库甚至可以包含一个脚本,以将示例文件视为模板,并自动对其进行修改和复制。


评论


这对签出存储库的所有用户有效吗?除非明确声明,否则他们是否会获得某些文件,但错误地不再能够添加更改?

–mmm
19-2-4在12:48



@momomo该标志存储在索引中,所以不,它仅适用于单个用户。请参阅erjiang的答案,以了解适用于所有用户的功能。

– 1615903
19年2月5日在5:04



我试图弄清楚文件的内容应该是什么。我评论了您提到的答案,但没有答案。它应该位于哪里,内容是什么?你知道吗?

–mmm
19年2月11日在10:15

我没有关注。该命令用于忽略您在命令中指定的一个特定文件。该文件的内容不相关。

– 1615903
19年2月11日在10:18

Git文档专门说不要为此目的使用git update-index --skip-worktree。

–bk2204
4月28日22:57

#3 楼

常见的做法似乎是创建一个devtargets.default.rb并提交它,然后指示每个用户将该文件复制到devtargets.rb(位于.gitignore列表中)。例如,CakePHP对其数据库配置文件执行相同的操作,该配置文件自然会在计算机之间变化。

评论


您无法.gitignore跟踪文件。 .gitignore仅对不在索引中的文件有效。

– CB Bailey
2010年7月23日在16:30

我试图避免这样做,尽管我确实没有充分的理由。我们现在正在这样做,我想记住我需要创建自己的版本而名称中没有“ .default”的情况很痛苦。

–德里克·贝利(Derick Bailey)
2010年7月23日在17:39

@DerickBailey但是,公平地说,对于每个克隆存储库的人来说,记住复制文件要比记住使用--assume-unchanged选项容易。

–丹
16年1月15日在13:15

@DerickBailey,如果devtargets.rb不存在,您还可以将rake构建设置为默认为devtargets.default.rb。

–卢克
16-09-30在20:07

@erjang该devtargets.default.rb文件中的内容是什么?一个例子?

–mmm
19-2-5在9:50



#4 楼

对于IntelliJ IDEA用户:如果要忽略文件的更改,可以将其移动到其他Change Set


转到Local ChangesCmd + 9
选择您要忽略的文件

F6将其移动到另一个Change Set