46

当我输入git status时,我看到:

# On branch master
# 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:   DIR/a
#

但是,在我的工作目录中,我看到这个文件实际上被调用dir/a了(注意小写dir而不是DIR)。

问题:我想将此修改后a的文件添加到暂存区并提交,但我希望它在我的工作目录中(显示dir/a) -与 git 将其视为DIR/a. 我怎样才能做到这一点?

重要的提示:

不幸的是,我不能仅仅git mv DIR/a dir/a因为DIR/a它实际上并不存在于工作树中。

目前我的.git/config文件显示ingorecase = true,所以我知道我必须将其设置为 false。然而,除了改变这个标志什么都不做之后,git status现在显示:

# On branch master
# 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:   DIR/a
#
 # Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   dir/

我预料到了这一点,因为 git 只跟踪内容,并且切换忽略大小写会使 git 认为添加了一个新文件。不幸的是,git 现在认为我有两个文件被修改,而实际上我只有一个。我想git status简单地显示dir/a(因为它在我的工作目录中)而不是DIR/a,与a我最近制作的相同差异。

附加说明

如果您对这种不稳定的情况最初是如何产生的感到好奇,我已经设法复制了我最初将我的目录的案例从 重命名为 时所犯的愚蠢DIR错误dir。如果您认为这有助于找到解决此问题的方法,我很乐意进行编辑,以揭示我是如何错误地使 git 如此困惑的。(这涉及到我不小心击中mv而不是git mv,并且不知道该ignorecase标志并将其保留为ignorecase=true)。

4

3 回答 3

101

示例:如果您是小写的 Mydir

git mv src/Mydir src/mydirs

git mv src/mydirs src/mydir

git commit -m "Rename folder Mydir to mydir"
于 2015-06-04T21:52:11.390 回答
21

我找到了解决方法。我不确定是否有更优雅的解决方案,但我已经对此进行了测试,它确实有效。因为 git 仍然认为只有一个文件存在两个文件,所以我实际上必须完全复制目录,删除 git 作为文件跟踪的内容,然后将复制的目录 mv 恢复为原始目录。

(1) 提交任何dir需要提交的文件。

(2)cp -r dir tempDir

(3)git add tempDir/

(4)git rm -r dir Dir

(5)git commit -m "Temporary rename of dir to tempDir"

(6)git mv tempDir mms

(7)git commit -m "Full rename from DIR to dir complete"

于 2012-11-05T22:42:42.403 回答
16

您还可以在 git 配置中更改此敏感度。

git config core.ignorecase false
于 2020-08-05T08:09:01.123 回答