克隆期间发生Git错误:错误:未经跟踪的工作树文件<file>将被合并覆盖

时间:2018-04-09 21:53:33

标签: git

我刚刚删除了我的git repo并重新克隆了它。我无法弄清楚我将如何遇到下面的错误。

我在另一台机器上使用相同的仓库(和其他几十台人一样)。我尝试按照建议的git checkout -f HEAD进行操作。它同步了许多在克隆期间遗漏的文件,但它仍然以某种方式显示了几十个修改和丢失的文件。我完全删除了旧目录。 df -h显示可用磁盘空间。

$ git clone git@github.com:myrepo/src.git
Cloning into 'src'...
remote: Counting objects: 83096, done.
remote: Compressing objects: 100% (309/309), done.
remote: Total 83096 (delta 351), reused 385 (delta 228), pack-reused 82556
Receiving objects: 100% (83096/83096), 785.59 MiB | 22.16 MiB/s, done.
Resolving deltas: 100% (41943/41943), done.
Checking connectivity... done.
error: Untracked working tree file 'common/ml/.pylintrc' would be overwritten by merge.
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

1 个答案:

答案 0 :(得分:1)

首先,请注意git clone本质上是一个包含以下步骤的多步骤过程:

  1. 创建一个新的空目录(或使用现有的空目录,如果有指示)。在这个新的空目录中完成所有工作。

  2. 在此空目录中创建一个空的Git存储库:git init

  3. 使用您提供的网址,默认添加名为origin远程。进行任何必要的配置(使用git configgit remote add)进行设置。根据您指定的配置选项,此时也可以进行其他配置。

  4. 运行git fetch origin(或您告诉Git使用的任何名称,而不是origin),以便从您提供的网址中提交所有提交内容。

  5. 在某个分支名称上运行git checkout,可能是master创建一个名为master的本地分支,指向与{{{1}相同的提交1}}。

  6. 这是失败的最后一步。现在,我们从上面知道origin/master应该是一个新的空目录。这意味着它实际上不能具有名为src的现有文件。

    可能会发生的事情是,正在检出的提交中可能有一个名为common/ml/.pylintrc的文件,这个common/ml/.pylintrc放入工作树。然后,在早期或稍后,正在检出的提交可以具有另一个名为git checkoutCOMMON/ML/.pylintrc的文件或一些基本上相同名称的文件。< / p>

    如果使用您正在克隆的存储库的人正在使用Linux,默认情况下它具有区分大小写的文件系统,这两个名称 - common/ML/.pylintrccommon/ml/.pylintrc或其他任何名称两个不同的文件,一切都很好。

    但是,如果您使用的是Mac或Windows系统,并且默认情况下使用 敏感的文件系统,则这两个不同的文件名名称​​相同文件。所以你的Git会用另一个文件覆盖一个文件,并意识到这是坏消息并中止common/ML/.pylintrc步骤。

    解决此类问题的最简单方法是运行Linux(例如,在Mac上的VM中)。在那里克隆存储库,解决问题,以便没有多个文件名只在大小写,提交,获得上游采用的修复方面有所不同,现在您可以在Mac或Windows系统上工作,将这两个不同的文件名视为一个基础文件。

    理论上可以通过其他方式解决这个问题,但它们肯定更难,而且我没有尝试过。