Git pull命令失败

时间:2014-04-29 05:45:41

标签: git github

我正在尝试从远程存储库向本地发出一个Git pull请求,但是它显示在错误下方,我无法拉动。

例如,git pull origin master

error: The following untracked working tree files would be overwritten by merge:
    db/development.sqlite3
    db/test.sqlite3
    log/development.log
    log/test.log
    tmp/cache/assets/C7D/310/sprockets%2F38d8bc4c0599099a0404900b377c353b
    tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
    tmp/cache/assets/CDC/870/sprockets%2Fa77b26f54f3481a4b4daf08514b49074
    tmp/cache/assets/CF0/DA0/sprockets%2Fd7d5b37686831d37c4dd75e645f5e016
    tmp/cache/assets/D09/A10/sprockets%2Fd608b39f93a782efe7398ab3797f6948
    tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
    tmp/cache/assets/D33/290/sprockets%2F94f084e7801a02e1fd62140be0f5e7cb
    tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
    tmp/cache/assets/D57/600/sprockets%2Fec4b1ce010bcc065da023308f49a9d55
    tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
    tmp/cache/assets/D6A/C30/sprockets%2Fd5b294a2f636c6ee22c18e24b19fdc41
    tmp/cache/assets/D84/A20/sprockets%2Fd88ae988de6a691a6d472eee0441ad88
    tmp/cache/assets/DCE/C90/sprockets%2Febaf322f09c9ee13f29fc061542fe6af
    tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
    tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
    tmp/cache/assets/E25/4C0/sprockets%2Fde2fd9fd11c04a582cdbbe3d84a35ae6
    tmp/pids/server.pid
Please move or remove them before you can merge.

我刚刚开始使用Git,并且不知道为什么会出现这个错误。我该如何解决?

2 个答案:

答案 0 :(得分:0)

您的工作树中有未跟踪的文件。你帖子中列出的那些。您尝试与git pull合并的某些提交将被合并覆盖。这不安全。它不安全,因为这些文件没有跟踪,所以Git不可能知道如何处理它们。它应该保留您拥有的文件并忽略传入的更改吗?它应该覆盖它们吗?它不可能知道,只有你可以知道。所以它拒绝做一些危险的事情。

通常,您需要将这些文件移开。例如,创建一个临时目录并将这些文件移动到那里。或者将它们放在备份文件中并从工作树中删除文件。

我正常写 ,因为这看起来像一个特例。您的本地存储库是正确的,不跟踪这些文件:tmp/*看起来像临时缓存文件,log/*文件看起来像日志文件,db/*看起来像二进制数据库文件。通常,版本控制都不应跟踪这些内容。但是现在在您尝试合并的远程存储库中跟踪它们。看起来开发人员犯了一个错误,并将这些文件偶然添加到版本控制中。

要做的最好的事情就是找到那些提供这些文件并要求他自己清理的开发人员(因此他不会再这样做)。在他从存储库中删除文件并再次推送后,您的git pull命令将起作用。

如果难以让作者解决存储库中的问题,您可以自行修复:

# create a clean clone to preserve your workspace
git clone URL /tmp/cleanup
cd /tmp/cleanup

# remove the junk
git rm -r db log tmp

# commit the fix (copy-pasted from @gturri's answer)
git commit -m "Removed binary and temporary files from Git"
git push

在此之后,您的git pull命令将起作用。

最后,有助于防止这样的错误的是项目中正确配置的.gitignore文件。在您当前的工作区中,如果您执行git status并且看到tmplogdb未跟踪,那就不太好了。这意味着这些目录不会被标记为被忽略,并且更容易犯这样的错误并意外地提交这些文件。在这种情况下,请更新您的.gitignore,这样将来会更难以犯这样的错误。

答案 1 :(得分:0)

这意味着:

  • 您在本地拥有这些文件,而您尚未对其进行版本化。
  • 在远程存储库的master中跟踪这些文件。

如果要合并,请使用快速解决方案:删除这些本地文件:

rm -rf db log tmp
git pull origin master

速度较慢但更简洁的解决方案:您可能是对的:您不应该对二进制文件或临时文件进行版本控制。当他/她添加这些文件时,开发人员可能会搞砸。你可以让他/她解决它,然后pull

你也可以自己解决,也就是说:拉完之后,你可以做到

git rm -rf db log tmp
git commit -m "Removed binary and temporary files from Git"

为了确保错误不再发生,删除后,您可以要求Git忽略这些文件,以确保不会再错误地添加它们。

为此,在存储库的根目录中添加一个名为.gitignore的文件,并按照以下方式添加:

*.sqlite3
*.log
tmp

BTW,在添加此文件后,您可以尝试执行git status,看看Git不再关心它们了。