如何忽略已经被git跟踪的文件(为什么git update-index --assume-unchanged突然停止工作)?

ddrv8njm  于 2023-08-01  发布在  Git
关注(0)|答案(2)|浏览(114)

我有一个大型项目,我正在作为一个10名开发人员的团队的一员工作,有几个配置文件和其他与设置相关的文件,我们每个人都需要不同。
我知道最明显的解决方案是不对这些文件进行源代码控制,要么将它们添加到.gitignore文件中,要么将它们添加到<project root dir>/.git/info/exclude中。
这些方法的问题是:
1.这些文件已经在源代码控制中,这意味着.git/info/exclude将无法工作。
1.我的队友拒绝引入.gitignore文件,原因有很多,我不会让你感到厌烦。
因此,经过一些研究,我发现了git update-index命令及其--assume-unchanged选项,这似乎非常适合我的用例。我现在有麻烦的文件标记了它,还有一个post-checkout钩子,它可以在每次结账时从外部目录复制我自己的本地文件副本到正确的位置。
这基本上是可行的,并具有以下好处:
1.对于我的本地开发环境,我的设置总是正确的。

  1. Visual Studio中的Git更改窗口保持清除这些文件,这意味着我不能不小心忘记在提交之前不要暂存它们(我习惯于将所有内容都一次性暂存和提交)。
    唯一的问题是,有时候,由于一些完全超出我理解的奇怪原因,git似乎“忘记”了我已经明确告诉它忽略这些文件,导致以下结果:
    1.对我最终想要提交的文件进行一些更改。
    1.老板走沿着说:“这个关键的bug刚刚出现,放下一切,立即修复它!“所以我git stashgit checkout master并尝试git pull 1。
  2. Git告诉我error: Your local changes to the following files would be overwritten by merge: <list of files>
    1.在咒骂和敲打键盘5分钟后,我意识到我需要git update-index --no-assume-unchanged <list of files>,然后git checkout -- <list of files>,然后git pull,最后git checkout -b new-bugfix-branch 1。
    那么,为什么会发生这种情况,有没有更好的方法来实现上述结果呢?MTIA:-)
    1:运行这些命令并不是我 * 实际 * 做事情的方式;就像之前提到的,我使用Git更改窗口来做几乎所有与Git相关的事情,只有在绝对必要的时候才使用完整的终端命令。但我在所述UI中所采取的操作等同于给定的命令。
wkyowqbh

wkyowqbh1#

Git不支援忽略追踪的档案。Git常见问题解答是这样说的:
Git没有提供实现此功能的方法。原因是,如果Git需要覆盖这个文件,比如在 checkout 的时候,它不知道对文件的修改是重要的还是应该保留的,或者它们是否无关紧要,可以安全地销毁。因此,它必须采取安全的路线,并始终保护他们。
这就是你所看到的问题。常见问题解答继续:
尝试使用git update-index的某些特性(即assume-unchanged位和skip-worktree位)是很有诱惑力的,但是这些特性不能正确地用于此目的,因此不应该以这种方式使用。
但是,它接着提供了一个如何操作的示例:
如果您的目标是修改配置文件,则将一个文件签入到存储库中通常会很有帮助,该文件是一个模板或一组默认值,然后可以将其复制到旁边并根据需要进行修改。通常会忽略第二个已修改的文件,以防止意外提交。

8wtpewkr

8wtpewkr2#

只需使用此命令从缓存中删除忽略文件

git rm --cached -r  FilePath

字符串
或者你可以删除所有的缓存与此代码下次提交再次

git rm --cached -r .

警告

在第二种方式,其他开发人员失去了他们的文件在拉
第一种方式更安全更好

相关问题