2014-04-29 5 views
1

Я пытаюсь сделать запрос Git pull из удаленного репозитория на локальный, но он отображается ниже ошибки, и я не могу тянуть.Ошибка при выполнении команды 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 сейчас и понятия не имел, почему произошло это ошибка. Как мне его решить?

ответ

0

У вас есть необработанные файлы в рабочем дереве. Те, что указаны в вашем посте. Некоторые из коммитов, которые вы пытаетесь объединить с git pull, будут перезаписаны слиянием. Это небезопасно. Это не может быть безопасно, потому что эти файлы не отслеживаются, поэтому Гит не может знать, что с ними делать. Должны ли они хранить файлы, которые у вас есть, и игнорировать входящие изменения? Должна ли она перезаписывать их? Он не может знать, только вы можете знать. Поэтому он отказывается делать что-то опасное.

Обычно, вам необходимо перенести эти файлы с пути. Например, создайте временный каталог и переместите туда эти файлы. Или поместите их в резервный файл и удалите файлы из рабочего дерева.

Я написал обычно, потому что это выглядит как особый случай. Ваш локальный репозиторий прав, что эти файлы не отслеживаются: 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, и вы видите tmp, log, db как нет следа, это не так хорошо. Это означает, что эти каталоги не отмечены как игнорируемые, и легче совершать ошибки, подобные этому, и случайно передавать эти файлы. В этом случае обновите свой .gitignore, что сделает его намного сложнее сделать такую ​​ошибку в будущем.

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 

Кстати, после добавления этого файла, вы можете попробовать делать git status, чтобы увидеть, что Гит больше не заботится о них.

+0

, а также добавьте три файла в '.gitignore', чтобы эти файлы никогда не проверялись снова. – Litmus

+0

Действительно. Я только что отредактировал свой ответ, чтобы добавить этот совет. – gturri

Смежные вопросы