30

我让自己陷入了一种奇怪的情况,在我的一个分支中,无法将 web.config 文件添加到舞台上。的输出

git add path/to/web.config
git status

与添加文件之前相同。Web.config 似乎需要修改并且尚未添加到阶段。

也许更有趣的是,当我从文件系统中删除 Web.config 并运行时,git status我得到的输出表明我有两个 web.config文件可以被删除并且没有暂存。

# Changes not staged for commit:
#   deleted: path/to/Web.config
#   deleted: path/to/web.config

请注意,一个有大写 W,另一个有小写 w。我在实际文件系统上删除的文件是大写的“W”。

编辑 1

的输出git ls-files --stage显示索引中确实有两个文件因大小写而异。

100644 63cd5911b9b12bbad559bb69b1b596708b932061 0 path/to/Web.config
100644 d60ab44bb38f05ffce126ddd3c3293b06e6e4096 0 path/to/web.config

我将这些中的每一个输出到一个文件git cat-file -p <hash> > <file>并比较这两个文件。虽然文本内容相同,但大写 Web.config 包含 CRLF 结尾,小写 web.config 包含小写结尾。

编辑 2

从文件系统中物理删除的文件git reset HEAD会产生此输出,但文件不会在文件系统上恢复,因此无法添加。

Unstaged changes after reset
D    path/to/Web.config
D    path/to/web.config

当我在 Windows 上工作时,我希望工作目录中的文件具有 CRLF,但我希望将文本文件与 LF 一起存储在内部 Git 数据库中。所以,我假设那将是 63cd591,但我可能会离开这里。

在这种情况下,如何从索引中永久删除 path/to/web.config?我在 Windows 上,我的路径上不能有两个仅因大小写而异的文件。

4

2 回答 2

31

这个特定问题的最终解决方案是从 git 缓存中删除两个 web.config 条目,提交任何更改,然后将所需的 Web.config 文件重新添加回 git。

git rm --cached path/to/Web.config
git rm --cached path/to/web.config
git commit -m "Repair confused cache"
git add path/to/Web.config
git commit -m "Add Web.config"
于 2013-08-21T12:18:31.133 回答
16

通常,当 git 进入混乱状态时,将文件删除并重新添加到缓存将修复它:

git rm --cached foo

文件进入混淆状态的最常见方式似乎是mv从命令行执行 a 时。
我发现使用 git mv 而不是mv有助于防止遇到此问题。 http://linux.die.net/man/1/git-mv

最后,如果您要从 git 存储库中删除文件,请使用git rm而不仅仅是rm
为什么使用 'git rm' 来删除文件而不是 'rm'?

https: //www.kernel.org/pub/software/scm/git/docs/git- rm.html`

于 2013-07-23T23:58:51.490 回答