devtargets.rb
的文件中,该文件在我们的rake构建任务中使用。我不希望开发人员破坏彼此的devtargets文件。 我首先想到的是将该文件放入
.gitignore
列表中,以便不提交给git。然后我开始怀疑:是否可以提交该文件,但是忽略对文件的更改?因此,我将提交文件的默认版本,然后当开发人员在其本地计算机上对其进行更改时,git将忽略所做的更改,并且当您执行git status或git commit时,它不会显示在更改的文件列表中。
可能吗?这肯定是一个不错的功能...
#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 Changes
(Cmd + 9
)选择您要忽略的文件
F6
将其移动到另一个Change Set
评论
另请参见stackoverflow.com/questions/3318043/…关于类似主题。提交机器特定配置文件的可能副本
git只在本地忽略文件