Что вы, вероятно, сделали, чтобы вызвать это:
Такого рода вещи случаются, когда вы отправляетесь в небольшую программу. Вы собираетесь изменить что-то, что уже работало, поэтому вы разыгрываете заклинание 3-го уровня вечной отмены:
machine1:~/proj1> git init
и вы начинаете добавлять / совершать. Но затем проект становится более активным, и вы хотите работать над ним с другого компьютера (например, домашнего компьютера или ноутбука), поэтому вы делаете что-то вроде
machine2:~> git clone ssh://machine1/~/proj1
и он клонируется, и все выглядит хорошо, и поэтому вы работаете над своим кодом с machine2.
затем ... вы пытаетесь отправить свои коммиты с machine2, и вы получите предупреждающее сообщение в заголовке.
Причиной этого сообщения является то, что git-репо, из которого вы извлекли, было как бы предназначено для использования только для этой папки на машине1. Вы можете клонировать его просто отлично, но нажатие может вызвать проблемы. «Правильный» способ управления кодом в двух разных местах - это «голое» репо, как было предложено. Голые репо не предназначена, что любая работа делается в ней, она призвана координировать коммиты из нескольких источников. Вот почему самый лучший ответ предлагает удалить все файлы / папки, кроме папки .git, после того, как выgit config --bool core.bare true
.
Уточнение ответа с самым высоким рейтингом: во многих комментариях к этому ответу говорится что-то вроде: «Я не удалял файлы, не относящиеся к .git, с machine1, и я все еще мог зафиксировать с machine2». Вот так. Однако эти другие файлы полностью «отделены» от git-репо. Попробуйте git status
там, и вы должны увидеть что-то вроде «роковой: эта операция должна выполняться в рабочем дереве». Таким образом, предложение удалить файлы не так, чтобы коммит с machine2 работал ; это чтобы вы не запутались и не подумали, что git все еще отслеживает эти файлы. Но удаление файлов является проблемой, если вы все еще хотите работать с файлами на компьютере1, не так ли?
Итак, что вы должны делать?
Зависит от того, сколько вы планируете по-прежнему работать на machine1 и machine2 ...
Если вы закончили разработку с machine1 и перенесли всю свою разработку на machine2 ... просто сделайте то, что предлагает ответ с самым высоким рейтингом: git config --bool core.bare true
а затем, при необходимости, удалите все файлы / папки, кроме .git, из этой папки, так как они не отслежены и могут вызвать путаницу.
Если ваша работа на machine2 была разовой, и вам не нужно продолжать там разработку ... тогда не пытайтесь делать голое репо; просто ftp / rsync / scp / и т.д. ваши файлы с машины * 2 * поверх файлов на машине * 1 *, подтвердите / нажмите с машины * 1 *, а затем удалите файлы с машины * 2 *. Другие предлагали создать ветку, но я думаю, что это немного запутанно, если вы просто хотите объединить какую-то разработку, которую вы делали единовременно, с другой машины.
Если вам нужно продолжить разработку как на machine1, так и на machine2 ... тогда вам нужно правильно все настроить. Вам нужно конвертировать репо в голое, затем вам нужно сделать клон этого на machine1, чтобы вы могли с ним работать . Вероятно, самый быстрый способ сделать это -
machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1
Очень важно: поскольку вы перенесли расположение репозитория с proj1 на proj1.git, вам необходимо обновить его в файле .git / config на machine2 . После этого вы можете зафиксировать свои изменения с machine2. Наконец, я стараюсь хранить свои голые репозитории в центральном месте, вдали от моих рабочих деревьев (то есть не помещайте «proj1.git» в ту же родительскую папку, что и «proj1»). Я советую вам сделать то же самое, но я хотел, чтобы описанные выше шаги были максимально простыми.