未跟踪的文件仍会出现在git状态中。

5

我通过使用.git/info/exclude取消跟踪了一些文件夹和文件:

doc
*.txt
doc/*.txt
doc/somefile.txt

但是git status显示它仍然被跟踪:
$ git st
# On branch dev
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   doc/somefile.txt

另一个奇怪的事情是,ls-files 显示它未被跟踪:

$ git ls-files --ignored --exclude-from=.git/info/exclude
doc/somefile.txt
$ touch /tmp/xxx
$ git ls-files --ignored --exclude-from=/tmp/xxx
$

我正在使用Git版本1.8.1.5。

因此,我得出结论可能是我对某些事情的理解有误或者做错了什么。请问您有什么想法吗?


请取消 Git 中的文件跟踪:https://dev59.com/sGw05IYBdhLWcg3w41wp - ThanksForAllTheFish
3个回答

6

由于您在本地忽略了存储库中的文件,因此需要告诉git您正在忽略它们。

git update-index --assume-unchanged <files to forget>

1
这是正确的答案。@lalebarde,我可以补充一下,你不是在“取消跟踪”文件,而是在忽略它们。它们已经被跟踪,因此您必须遵循@Abizern的建议让git忘记它们。查看此解释以了解为什么update-indexrm --cached更好的解决方案。 - ThanksForAllTheFish
那个命令从来没有被设计用来解决这种类型的问题,而且开发者认为在这种情况下使用它是一个坏主意。它被设计成一种在某些情况下提高性能的方式。Git 将把它视为文件不会在其下面被更改的承诺,但在这种情况下完全不是真的。在这样做之后使用 git stash 很可能会导致本地更改丢失。请参阅 http://article.gmane.org/gmane.comp.version-control.git/225308 周围的线程。在其他情况下也可能存在问题。 - qqx

3

您需要执行git rm --cached <file>。这并不会从您的工作目录中删除该文件,但它将其从Git缓存中删除,因此现在它将被包括在.gitignore中。


他没有使用.gitignore,而是使用.git/info/exclude这个本地仓库排除文件。 - Abizern
啊,没错。他说的是“取消跟踪”而不是“忽略”,所以这取决于他对文件想要做什么。 - Nicholas Smith

0

由于文件正在被跟踪,您需要在忽略它们之前告诉git忘记它们。

git rm --cached doc/somefile.txt


不,那会删除文件,而不是忽略它们。 - Abizern
哦,我的错。我忘记了 --cached 标志。 - jlundqvist

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