谁改动了我的Git“假定未更改位”?

19

我的代码库里有一个文件,我已经设置了“假定未更改”位:

git update-index --assume-unchanged someFile.txt

有时在对repo进行一些工作后,那个位被取消设置,文件就会自动不再是assume-unchanged状态。

是谁在修改它?我如何使其永久保持,直到我明确告诉git需要修改为止:

git update-index --no-assume-unchanged someFile.txt

这里发生了什么事?


编辑:我在本地修改的配置文件上使用了 --assume-unchanged,它们永远不会被提交,更不用说推到上游了。我不想在 git status 或其他任何地方看到它们,除非我明确告诉 Git 我要编辑并提交其中一个。


编辑:好的,我想我成功地复现了这个问题。

我从另一个库(它没有将该文件设置为--assume-unchanged)提交了该文件,然后在我的库中拉取,确实,位被重置了。

所以有两个问题:

  1. 是否可以在中央权威存储库上设置此位,以便它传播到所有存储库?
  2. 是否可以使此位粘性,即使在远程修改它之后也有效?

我认为这个功能已经在git列表上至少考虑过一次了(至少在Mark下面提到的线程中)。不过我认为没有人站出来实现它。 - Jan Hudec
发现另一个相关的线程:http://thread.gmane.org/gmane.comp.version-control.git/146082 - Yuval Adam
没有权威的仓库 - 请查看我的类似问题:http://stackoverflow.com/questions/25123374/stop-tracking-a-file-in-git-without-having-it-deleted-either-locally-or-on-pul/25123571?noredirect=1# 和这篇博客文章,了解 git assume unchanged vs skip worktree:fallengamer.livejournal.com/93321.html - Mr_and_Mrs_D
2个回答

3
如果你忽略一个版本化的文件,它将表现得像这样。你可以从.gitignore覆盖所有工作树,或者从.git/info/exclude中忽略特定的工作树(是的,它可以工作,但不是预期的方式)。

1
忽略这种“宝贵”的文件可能是危险的。Git将被忽略的文件视为可丢弃的,并在版本之间移动时可能会覆盖它们。(忽略机制旨在用于构建产品。) - Mark Longair
忽略不是当前问题。忽略只适用于未版本化的文件。我说的是对于已版本化的文件使用 --assume-unchanged - Yuval Adam
@Yuval:实际上不是这样的。我不确定这是git中添加语义设计的副作用还是意外,但如果一个版本化的文件匹配忽略模式,git会看到这个文件,但会忽略对其所做的更改。换句话说,它的行为类似于“--assume-unchanged”。 - Jan Hudec
1
@Jan Hudec:当然,可以看看来自git邮件列表的此线程,Junio在其中说:“大多数情况下,“忽略”也意味着“可以安全地丢弃”。' 我应该补充一点,当我艰难地发现这一点时,这对我来说是一个讨厌的惊喜... - Mark Longair
2
嗯,我明白了。划掉答案(这样其他人就不必重复错误了)。 - Jan Hudec
显示剩余2条评论

1

看起来 --skip-worktree + 稀疏检出可以允许这种行为。

来自git assume unchanged vs skip worktree - ignoring a symbolic link带有一些上下文修改):

  • core.sparseCheckout 设置为仓库的 true。
  • 创建一个文件 .git/info/sparse-checkout,其中包含两个模式:* 包括所有内容和 !/path/to/someFile.txt 排除本地文件 'someFile.txt'。
  • 现在,手动将 skip-worktree 位设置为 someFile.txt。

现在您可以继续进行而不必担心 git 会自动提交目录,但请注意,如果有人明确在目录或其中任何文件上运行 git add,则仍然会遇到问题。

进一步研究man页面似乎表明,--skip-worktree更适合所询问的用例。

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