Что это за предупреждение Git при отправке изменений в удаленный репозиторий?
Описание немного лаконично. Я просто добавил файл в свою локальную главную ветку и перенес его в удаленное хранилище. Есть идеи, почему это происходит?
предупреждение: обновление текущей ветки предупреждение: обновление текущей извлеченной ветки может вызвать путаницу, предупреждение: так как индекс и рабочее дерево не отражают изменения в HEAD. предупреждение: В результате вы можете увидеть изменения, которые вы только что вставили в него, предупреждение: оно отменяется, когда вы запускаете там 'git diff', и вы можете захотеть предупреждение: запустить 'git reset --hard' перед тем, как начать работать для восстановления, Warning: Warning: Вы можете установить переменную конфигурации 'receive.denyCurrentBranch' в предупреждение: 'отказывать' в удаленном хранилище, чтобы запретить вставку в его предупреждение: текущая ветвь. предупреждение: чтобы разрешить вставку в текущую ветку, вы можете установить для нее значение "игнорировать"; предупреждение: но это не рекомендуется, если вы не решили обновить его рабочее предупреждение: дерево, чтобы оно соответствовало тому, что вы выдвинули другим способом. предупреждение: предупреждение: чтобы подавить это сообщение, вы можете установить его на "предупреждение". warning: warning: обратите внимание, что значение по умолчанию изменится в будущей версии git warning: отказать в обновлении текущей ветви, если для переменной конфигурации warning: не задано значение "ignore" или "warn".
3 ответа
На самом деле, это в значительной степени означает именно то, что написано: кто-то работает в репозитории, в который вы нажимаете, и что кто-то в настоящий момент извлек ту же ветку, в которую вы нажимаете.
Это очень сбивает с толку, потому что теперь он думает, что проверил последнюю версию ветки, когда, на самом деле, вы только что обновили ветку до более новой версии. Итак, когда он сейчас бежит git commit
его коммит по существу вернет все коммиты, которые вы только что нажали. И когда он бежит git diff
он увидит противоположность всему, что вы только что нажали, хотя, может быть, он даже ничего не изменил.
По этой причине, как правило, считается плохой практикой продвигаться в не-пустое хранилище; Вы должны только когда-либо выдвигать к пустым репозиториям, то есть репозиториям, которые не имеют прикрепленной рабочей копии. По крайней мере, вы должны убедиться, что вы не нажимаете на текущую извлеченную ветку, но, как правило, вы должны не просто вставить свой код в чей-то репозиторий, вы должны попросить его вытащить его из себя.
В некоторых особых случаях, например, когда вы обслуживаете веб-сайт из репозитория Git и хотите обновить веб-сайт, нажав на него, на самом деле имеет смысл перейти на текущую извлеченную ветку, но в этом случае вы должны убедиться, что что у вас установлен хук, который фактически обновляет извлеченную рабочую копию, иначе ваш сайт никогда не будет обновлен.
с Git 2.3.0, февраль 2015
Если в этом удаленном репозитории non-bare никто не работает, то должна быть возможность перейти к извлеченной ветке.
Но чтобы быть более безопасным в этой операции, теперь вы можете (с Git 2.3.0, февраль 2015 г.) сделать в этом удаленном репо:
git config receive.denyCurrentBranch updateInstead
Это более безопасно, чем конфиг receive.denyCurrentBranch=ignore
: это разрешит толчок, только если вы не отменяете изменение в процессе.
Смотрите коммит 1404bcb Йоханнеса Шинделина ( dscho
):
receive-pack
: добавить еще один вариант дляreceive.denyCurrentBranch
При синхронизации между рабочими каталогами может быть удобно обновить текущую ветку с помощью '
push
' скорее, чем 'pull
', например, при извлечении исправления изнутри виртуальной машины или при отправке исправления, сделанного на машине пользователя (где разработчик не вправе устанавливать демон ssh, не говоря уже о том, чтобы знать пароль пользователя).Обычный обходной путь - вставка во временную ветку и затем слияние на другом компьютере - больше не требуется с этим патчем.
Новая опция:
updateInstead
Обновите рабочее дерево соответствующим образом, но откажитесь сделать это, если есть какие-либо незафиксированные изменения.
Коммит 4d7a5ce добавляет больше тестов и упоминает:
В предыдущем тесте тестировался только тот случай, когда путь, подлежащий обновлению посредством push-to-deploy, имеет несовместимое изменение в рабочем дереве цели, которое уже добавлено в индекс, но сама функция хочет, чтобы рабочее дерево было намного чище, чем то, что тестируется.
Добавьте еще несколько тестов для защиты функции от будущих изменений, которые по ошибке (с точки зрения изобретателя функции) ослабляют требование чистоты, а именно:
- Изменение только в рабочем дереве, но не в индексе, все еще должно быть защищено;
- Не отслеживаемый файл в рабочем дереве, который будет перезаписан при развертывании push-to-deploy, должен быть защищен;
- Изменение, которое делает файл идентичным перемещаемому файлу, все еще является изменением, которое необходимо защитить (т. Е. Требование чистоты функции является более строгим, чем требование извлечения).
Кроме того, проверьте, что изменение только статистики в рабочем дереве не является причиной отклонения push-to-deploy.
с Git < 2.3.0, февраль 2015
Наиболее распространенный подход - создать пустой репозиторий из не-пустого репозитория, а удаленные / локальные не-голые репозитории git указывают на только что созданный пустой репозиторий.
Это та же проблема, что и этот вопрос, решение заключается в использовании git init --bare
или же git clone --bare
,