为什么git忽略我更改的文件?

时间:2009-08-25 16:24:05

标签: git gitignore

我对git工作目录中的文件进行了任意更改。

git status无法识别文件已更改。

git add /path/to/file无效。

git add -f /path/to/file无效。

git status /path/to/file将文件显示在“要提交的更改”存储桶中。

我删除了我的.gitignore文件,只是为了确定。没有改变上述任何行为。

我完成了git reset --hard,重新做了我的改变。没有改变上述任何行为。

这可能会发生什么?

9 个答案:

答案 0 :(得分:26)

另外请确保您没有手动更新索引,以假设更改的文件未更改,如下所示:

git update-index --assume-unchanged path/to/file

听起来我听起来很愚蠢,然后几天后对文件进行了更改,无法弄清楚为什么git没有跟踪它。我尝试了以上所有建议,并且不停地拉出我的头发b / c已更改的文件未列在任何.gitignoreexclude文件中。

如果您告诉git假设文件未更改,则必须:

git update-index --no-assume-unchanged path/to/file

或者只是重新克隆回购,就像我记得我做过之前最后做的那样......

答案 1 :(得分:16)

原来我在我的文件 [1]

上添加了skip-worktree
git update-index --skip-worktree path/to/file

忘记了。您可以通过以下方式撤消此操作:

git update-index --no-skip-worktree path/to/file
带有ls-files

-v在我的案例中显示了该文件的状态:

git ls-files -v | grep path/to/file
S path/to/file

字母git ls-files -v前缀为are和mean:

# H: cachead
# S: skip-worktree
# M: unmerged
# R: removed/deleted
# C: modified/changed
# K: to be killed
# ?: other
# lowercase letter: assume-unchanged

确定您的问题

git是否忽略了该文件?

git check-ignore * **/* | grep path/to/file
git ls-files --exclude-standard --ignore

如果列出了该文件,则会在某处将忽略规则排除在外。 [2] [3]在其中一个文件中找到它:

less .gitignore
less ~/.gitignore
less %USERPROFILE%\.gitignore # <- Probably the same file as the above one
less $( git config --global core.excludesfile )
less $( git config --system core.excludesfile )
less ${GIT_DIR:-.git}/exclude

文件是否标记为assume-unchanged

git ls-files -v | grep path/to/file

如果文件的前缀是小写字母,则标记为assume-unchanged。修复它:

git update-index --no-assume-unchanged path/to/file

文件是否标记为skip-worktree

git ls-files -v | grep path/to/file

如果文件的前缀为S,则会标记为skip-worktree。修复它:

git update-index --no-skip-worktree path/to/file

答案 2 :(得分:9)

Git忽略文件的原因有两个:gitignoresubmodules

更具体地说,以下条件会导致Git在调用“git add”时忽略文件:

  1. 该文件与$GIT_DIR/exclude中的模式匹配。
  2. 该文件与repo中.gitignore文件中的模式匹配。
  3. 该文件与用户特定的.gitignore文件中的模式匹配(由“git config --global core.excludesfile”指定)。
  4. 该文件是子模块的一部分。
  5. 更多信息可以在另一个SO问题中找到:

    Unable to track files within Git submodules

答案 3 :(得分:6)

使用

进行检查
$ git ls-files --exclude-standard --ignore

如果确实没有排除该文件(除了.gitignore之外还有其他排除文件)。

答案 4 :(得分:4)

您检查全局git ignore文件?

git config --global --get-all core.excludesfile
git config --system --get-all core.excludesfile

如果其中任何一个返回文件作为其值,请查看该文件。

答案 5 :(得分:2)

如果您的文件位于“要提交的更改”存储桶中,那么git 已经识别更改并将提交它!它在索引已经。否则它将在“已更改但未更新”的存储桶中。

<强>:)

希望这会有所帮助/

答案 6 :(得分:1)

您确定父文件目录中的某些.gitignore文件没有排除您的文件吗?

答案 7 :(得分:0)

你做了git add之后,你做了一次提交,所以它实际上是在repo中,可以与(改变的)工作副本进行比较吗?

答案 8 :(得分:0)

检查相关文件中的每个父目录到.gitignore文件的项目根目录。

有些项目使用多个.gitignore文件,每个文件都在自己的目录中,而不是根目录中的单个.gitignore。