Git不会忽略两个具体命名的文件。

99

我想要自动排除两个文件的提交,它们是git存储库的一部分,但有一些更改不应该成为github存储库的一部分,因为它们只对我的本地系统有意义,而不是其他开发人员。

我将它们添加到.git/info/exclude中,希望git能理解他不应该提交这些更改:

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
a.conf
b.conf
# *~

但是git status仍将它们列为准备提交的暂存文件:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   build/conf/a.conf
#   modified:   build/conf/b.conf
#

我不想每次提交时都定期取消暂存它们(有一次我可能会忘记),我应该怎么做?


2
为什么不用.gitignore呢? - maverik
7
你不能忽略你正在追踪的文件。你可能需要找到另一种管理本地系统特定信息的方式,比如有“模板”文件供你生成或手动编辑配置文件。 - CB Bailey
5
如果 exclude 不起作用,.gitignore 也不会。使用 exclude 的情况是此信息仅在本地,而 .gitignore 可以被检入并共享。当您不想扩大 .gitignore 文件时,使用 exclude 来处理本地内容。想象一下一个大型项目,在其中每个开发人员都将他的排除项输入到 .gitignore 中。这将变得难以管理... - eckes
1个回答

220

您想要的是忽略已跟踪文件的更改。这不能通过.gitignore.git/info/exclude正确实现(正如Charles Bailey所说)。

您需要使用git update-index

git update-index --assume-unchanged build/conf/a.conf
git update-index --assume-unchanged build/conf/b.conf

您希望实现的目标是:文件始终被视为未更改。

如果您想再次跟踪这些文件的更改,请使用--no-assume-unchanged

最后,如果您想知道哪些文件当前处于--assume-unchanged模式,请向git询问。

git ls-files -v | grep -e "^[hsmrck]"

对我来说很好用! - Gustyn
这个解决方案是否绑定到一个分支?让我们将文件1和文件2在branch1中标记为“假定未更改”。然后切换到branch2。这些文件也被标记为“假定未更改”吗? - nespapu
1
@Leo 无法生成文件是因为该文件尚未被跟踪。您可以简单地转到.git/info/exclude并添加要排除的路径。 - Augustus Francis
显然,git的维护者不同意这个答案:git-update-index --assume-unchanged从来没有被用来忽略已跟踪文件的更改。另请参见https://dev59.com/7mAg5IYBdhLWcg3w1uDy#23305143。 - AXO
2
@eckes 有没有办法让这个适用于所有分支?如果我使用命令进行更改,我就无法切换分支,并且会出现错误提示要么提交更改,要么将它们存储。 - Saber

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