Git pull提到了我找不到的未跟踪文件

时间:2017-07-28 18:35:20

标签: git git-pull

我正试图从Git中取出并得到错误:

The following untracked working tree files would be overwritten by merge:

:q
Please move or remove them before you merge.

我既不能找到这个文件也不知道它可能是指什么,或者为什么它以:

开头

git diff将其显示为新文件

2 个答案:

答案 0 :(得分:1)

(从评论中大大扩展;也许是一个答案,尽管原始问题中没有足够的信息要说明。)

首先,请注意:这是在Windows上吗? Windows有"问题"带有名称冒号的文件。 (我尽可能地避开Windows,并且我不确定这一点,但我认为甚至不可能在那里创建这样的文件。)其他系统应该处理它就好了,它不应该神秘地隐藏 - 但我将在下面探讨两种可能性。

另一方面注意:git pull只运行git fetch(从另一个Git获取提交并将其放入origin/master之下的存储库中),然后是git merge (将现在origin/master中的提交合并到您自己的master中)。我没有设置远程,所以在下面,我直接使用git merge,在我自己的存储库中使用命名的侧分支,而不是其中一个origin/master的东西(很多喜欢分支,但不是 - 至少不是相当 - 实际分支,因为Git术语很糟糕。)

查找奇怪命名的文件

你说你找不到:q文件 - 但是(a)没有提到你用来寻找它的工具,(b)做< / em>假设git diff将名为:q的文件显示为新文件(同样没有引用实际的git diff输出,这使得很难猜出你的意思)。这意味着您可以通过您正在使用的工具以外的其他工具间接地查看该文件,这通常会直接显示您的文件。

作为一项实验,我创建了一个新的存储库,并在其中创建了一些虚拟文件和一个侧面分支。在旁边分支中,我创建并提交了两个文件&#34;有趣&#34;名。一个具有四个字符名称冒号 Q 退格 退格 - 计划可以&#34;显示&#34;这个文件的名称是将:q字符串写入显示,然后将两个退格写入显示,以便下一个字符覆盖冒号和小写q。然后, next 文件名可以覆盖刚刚显示的文件名。另一个有趣的名字&#34;文件是冒号 Q 空间,在显示时看起来像:q没有空格,因为大部分屏幕&#39;空间充满了空间,看起来就像空间一样。 : - )

现在,这个特定系统上的ls命令并不那么幼稚,所以我们得到ls

$ ls
:q??    :q      README  file
屏幕上显示

,但如果我运行ls -C | expand,我会得到:

$ ls -C | expand
        :q      README  file

正如你所看到的那样,或许&#34;无法看到&#34;如果更好的措辞,名称中带有退格的文件似乎已经消失,除了占据列化文件列表中的一个插槽。我们确实知道它在那里!

通过git status

查找奇怪命名的文件

如果我现在运行git status,这就是它显示的内容:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    ":q\b\b"
    :q 

nothing added to commit but untracked files present (use "git add" to track)

在这里,Git特别注意显示嵌入式退格空间名称:它添加了双引号并使用\b对退格进行编码。然而,拼写有尾随空格的名称仍然相当巧妙地伪装:它显示为冒号,Q,空格和&#34;空格&#34;看起来和没有空间一模一样。

合并时Git做什么

由于我已在侧分支sidebr上提交了这些文件,因此任何合并它们的尝试都会产生:

$ git merge sidebr
error: The following untracked working tree files would be overwritten by merge:
    :q??
    :q 
Please move or remove them before you merge.
Aborting

同样,Git使用退格键做了一些聪明的事情(ish),但是尾随的空白只是复制到屏幕上(好吧,Terminal窗口),它看起来和背景一样。

从工作树中删除不需要的文件

要删除不需要的文件,我只需删除以冒号和q开头的所有文件:

$ rm :q*
$ ls
README  file

之后git merge sidebr成功:

$ git merge sidebr
<git makes me enter a merge commit message>
Merge made by the 'recursive' strategy.
 ":q\b\b" | 1 +
 :q       | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 ":q\b\b"
 create mode 100644 :q 

在下次提交中删除不需要的文件

现在不需要的文件已经回来了 - 我故意将它们提交到分支sidebr,专门设置这个问题。但是现在他们已经不再是未跟踪的文件了,所以要删除它们,我想使用git rm而不是普通rm,然后我想提交删除同样。

此时我遇到了另一个问题:

$ git rm :q*
fatal: pathspec ':q??' did not match any files

这里发生的事情是Git特别处理以冒号开头的参数。要解决此问题,我首先正常删除文件:

$ rm :q*

然后告诉Git更新它知道的所有文件,当然这包括这两个:q<otherstuff>文件:

$ git add -u

现在git status显示:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    ":q\b\b"
    deleted:    :q 

我可以运行git commit

$ git commit -m 'remove icky colon-named files'
[master 1e4e9f6] remove icky colon-named files
 2 files changed, 2 deletions(-)
 delete mode 100644 ":q\b\b"
 delete mode 100644 :q 

由于您从git merge收到同样的投诉,因此,一旦您从工作树中删除了不需要的文件,您的git pullgit merge会将其恢复为一个已提交(而非未跟踪)的文件,您将需要使用上述两步过程之类的内容进行删除。

为了完整性(无需阅读本节):为什么git rm :q*失败

还有一个替代技巧,我在此处将其包含在内。 Git与名为:q<space>等文件的问题不是空格,而是前导冒号。 This is documented under the definition of pathspec in the Git glossary.

  

以冒号开头的pathspec具有特殊含义。在简短形式中,前导冒号:后跟零或更多&#34;魔术签名&#34;字母(可选地由另一个冒号:)终止,其余部分是与路径匹配的模式。 &#34;魔术签名&#34;由ASCII符号组成,既不是字母数字,也不是字母,正则表达式,也不是冒号。可选的冒号终止&#34;魔术签名&#34;如果模式以不属于&#34;魔术签名&#34;的字符开头,则可以省略符号集,不是冒号。

     

在长形式中,前面的冒号:后跟一个左括号(,一个逗号分隔的零个或多个&#34;魔术词&#34;和一个紧密括号的列表),其余的是模式与路径相匹配。

在这种特殊情况下,:q<backspace><backspace>被视为:

  • 开始使用pathspec magic(:启动魔法)
  • 不做魔法(q是字母数字,并且不是一个开括号,所以这是简短的形式,没有魔法字符)
  • 使用名称q<backspace><backspace>

当然,该文件未命名为q<backspace><backspace>,而是:q<backspace><backspace>

在这里输入::q<backspace><backspace>会很有用,但在shell中使用:q*的意思是键入退格字符,而不是只需要擦除通常的时尚,很难,所以这就失败了。

使用rm :q*git add -u使Git搜索目录,该目录可以回避pathspec魔术。但还有另一个简单的诀窍:名称为:q<backspace><backspace>的文件名称种类繁多,其中大多数以冒号开头。其中最简单的是./:q<backspace><backspace>。 (其他包括././:q<backspace><backspace>等等,对于无数个前导./序列。)所以我们只是让shell为我们生成这些名称:

git rm ./:q*

现在我们已经准备好了。

我使用了上面的git add -u方法,因为它最有可能创建和提交这个奇怪命名的文件,无论其名称是什么 - 它可能是:q<space>,或{{ 1}},或:q<space><space>:q<tab>,在众多可能性中 - 可能使用:q<newline>git add .等来将其添加到提交中

答案 1 :(得分:0)

在我尝试退出vi时,我希望您输入:w:q 而不是:wq 。我不清楚为什么合并会破坏这个文件,但如果它的存在确实是偶然的,那么删除它是安全的。

我不确定为什么找到它会有问题。但我不明白为什么

rm :q

(在工作树根目录中)不会解决问题,如果确实你知道这是一个垃圾文件