为什么删除文件并创建具有相同名称的文件夹时GIT状态会令人困惑?

时间:2017-01-10 12:48:32

标签: git

我是在git repo中做到的。我的git版本是2.9.0。

touch a
git add --all
git commit -m "file created"
rm a
mkdir a
cd a
touch b
git status

现在状态显示了这一点,在未提交提交的更改中。

deleted: a 

但它没有显示任何事实,即创建了一个新文件夹(名为“a”)并且其中有一个新文件(名为“b”)。甚至没有未经修改的变化......

我的意思是新文件b,未跟踪文件部分或其他内容没有任何内容

所以令人困惑的是,如果我删除一个文件并创建一个具有相同名称的新文件夹/目录,git只会显示该文件被删除,但不是添加目录

但是,当我执行git addcommit时,我提交了更改。

但为什么status会以这种方式行事?为什么在删除文件并创建具有相同名称的文件夹时git会感到困惑?

4 个答案:

答案 0 :(得分:2)

这是git status中的一个小错误。作为Arpit noted,您必须让git status向您提供有关所有未跟踪文件的信息,而不是让它尝试汇总目录(“文件夹”)。相反,当它执行摘要时,它会因为索引中存在一个带有缩短版本名称的文件的条目而感到困惑:

$ mkdir rmtest; cd rmtest; git init
Initialized empty Git repository in /home/torek/tmp/rmtest/.git/
$ echo for testing rm file replace with dir > README
$ git add README 
$ git commit -m initial
[master (root-commit) c650ec0] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ echo create a as file > a
$ git add a
$ git commit -m 'add file a'
[master e33cff2] add file a
 1 file changed, 1 insertion(+)
 create mode 100644 a
$ rm a
$ mkdir a
$ touch a/b

我们现在处于您的状态:有一个名为a/b的未跟踪文件,而被跟踪的文件 a已丢失。跟踪文件a 仍在索引中,因此 将在下一次提交中。未跟踪的文件a/b在索引中,因此不在下一次提交中 - 它不能;跟踪文件a正在阻碍。

由于小错误,git status将此报告为:

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    a

no changes added to commit (use "git add" and/or "git commit -a")

但是,git status -uall使git status单独列出目录a的内容,而不是将它们概括为“在名为{{1的目录中有一个或多个未跟踪的文件” “,所以我们看到:

a

这是因为汇总版本使用路径$ git status -uall On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: a Untracked files: (use "git add <file>..." to include in what will be committed) a/b no changes added to commit (use "git add" and/or "git commit -a") ,如上所述 - 保留在索引中。如果我们强制执行新提交,我们可以看到新提交包含文件a

a

通常情况下,Git会在“未跟踪文件”部分中打印“a /”,但因为跟踪了$ git commit --allow-empty -m recommit [master d7cbb81] recommit $ git ls-tree -r HEAD 100644 blob ada8d39a4e96a31a4c7f2301dbfc807fcfdac71c README 100644 blob 739675cd3231d46a10d4b8f477cc1b35857758c1 a $ git log --all --decorate --oneline --graph * d7cbb81 (HEAD -> master) recommit * e33cff2 add file a * c650ec0 initial <(正如我们刚刚看到的那样,仍然会被提交!) 无法在那里报告(因为它缺少一个特殊情况,会暂时将其从内核缓存中删除以允许报告)。

有趣的是,如果你a

,同样的问题会有所不同
git reset HEAD a

请注意,在这里,Git将此问题报告为文件类型更改(文件类型已从“常规文件”变为“目录”,而Git不存储目录,因此这也是一个错误。)< / p>

如果我们将包含文件$ git reset HEAD a Unstaged changes after reset: T a 的目录a替换为普通符号链接a/b,则状态报告将变为正确,因为Git 能够存储符号链接,并且不试图总结任何事情:

a

答案 1 :(得分:1)

如果您在回购邮件中rm使用了git rm,那么git会更有效地管理您的更改。

答案 2 :(得分:0)

  

已删除:

Git显示此消息,因为您让Git注意到它正在运行命令:

git add -all
  

但它没有显示新文件夹(名为a)的事实   创建并在其中有一个新文件(名为b)。

因为你没有添加文件来使Git跟踪它。

修改

  

是的,但它没有在未跟踪的部分显示文件b,这就是   问题是关于

当您在未跟踪的文件夹中创建文件时,您必须使用--untracked-files\[=<mode>\]获取状态,如下所示:

git status -uall

答案 3 :(得分:0)

您可以运行以下命令强制更新未跟踪的文件,但我不知道为什么git在第一时间表现不好:

git update-index --untracked-cache