繁体   English   中英

Git拉命令失败

[英]Git pull command failed

我正在尝试从远程存储库向本地发出Git提取请求,但该请求显示在错误下方,并且无法提取。

例如, 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,不知道为什么会发生此错误。 我该如何解决?

您的工作树中有未跟踪的文件。 那些列在您的帖子中。 您尝试与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 ,这将使将来更难出错。

这意味着:

  • 您在本地拥有这些文件,但尚未对其进行版本控制。
  • 这些文件在远程存储库的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

顺便说一句,添加此文件后,您可以尝试执行git status ,以查看Git不再关心它们了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM