it-swarm.com.ru

Что это за предупреждение Git при отправке изменений в удаленный репозиторий?

Описание немного лаконично. Я просто добавил файл в свою локальную главную ветку и перенес его в удаленное хранилище. Есть идеи, почему это происходит?

 предупреждение: обновление текущей ветки 
 предупреждение: обновление текущей извлеченной ветки может вызвать путаницу, предупреждение 
: так как индекс и рабочее дерево не отражают изменения, которые есть в HEAD. 
 предупреждение: В результате вы можете увидеть изменения, которые вы только что добавили в него. 
 предупреждение: отменяется, когда вы запускаете 'git diff', и вы можете получить предупреждение 
: запустить 'git reset --hard' перед началом работы по восстановлению. 
 предупреждение: 
 предупреждение: вы можете установить переменную конфигурации 'receive.denyCurrentBranch' в 
 предупреждение: 'отказаться 'в удаленном репозитории запретить вставку в его предупреждение 
: текущая ветвь. 
 предупреждение: чтобы разрешить вставку в текущую ветку, вы можете установить для него "игнорировать"; 
 предупреждение : но это не рекомендуется, если вы не договорились обновить его предупреждение 
: дерево, чтобы оно соответствовало тому, что вы выдвинули другим способом. 
 предупреждение: 
 предупреждение: чтобы подавить это сообщение, Вы можете установить его на "предупреждение". 
 предупреждение: 
 предупреждение: Обратите внимание, что значение по умолчанию изменится в будущей версии предупреждения git 
: Отказать в обновлении текущей ветки, если у вас не установлено предупреждение конфигурации 
: Либо игнорировать, либо предупреждать. 
55
Coocoo4Cocoa

На самом деле, это в значительной степени означает именно то, что написано: кто-то работает в репозитории, в который вы нажимаете, и что кто-то в настоящий момент извлек ту же ветку, в которую вы нажимаете.

Это очень сбивает с толку, потому что теперь он думает, что проверил последнюю версию ветки, когда, на самом деле, вы только что обновили ветку до более новой версии. Итак, когда он теперь запускает git commit, his commit по существу вернет все коммиты, которые вы только что нажали. И когда он запустит git diff, он увидит противоположность всему, что вы только что нажали, хотя, возможно, он даже ничего не изменил.

По этой причине, как правило, считается плохой практикой отправлять в не-пустое хранилище; Вы должны только когда-либо толкать в пустые репозитории, то есть репозитории, которые не имеют прикрепленной рабочей копии. По крайней мере, вы должны убедиться, что вы не нажимаете на текущую извлеченную ветку, но, как правило, вы должны не просто вставить свой код в чей-то репозиторий, вы должны попросить их вытащить его из себя.

В некоторых особых случаях, например, когда вы обслуживаете веб-сайт из репозитория Git и хотите обновить веб-сайт, нажав на него, на самом деле имеет смысл нажать на текущую извлеченную ветку, но в этом случае вы должны убедиться, что что у вас установлен хук, который на самом деле обновляет извлеченную рабочую копию, иначе ваш сайт никогда не будет обновлен.

55
Jörg W Mittag

с Git 2.3.0, февраль 2015

Если в этом удаленном репозитории non-bare никто не работает, то должна быть возможность нажать на извлеченную ветку.

Но чтобы быть более безопасным в этой операции, теперь вы можете (с Git 2.3.0, февраль 2015 г.) сделать в этом удаленном репо:

git config receive.denyCurrentBranch updateInstead

Он более безопасен, чем config receive.denyCurrentBranch=ignore: он разрешает Push только в том случае, если вы не отменяете изменение в процессе выполнения.

См. commit 1404bcb по Йоханнес Шинделин (dscho) :

receive-pack: добавить еще одну опцию для receive.denyCurrentBranch

При синхронизации между рабочими каталогами может быть удобно обновлять текущую ветку с помощью "Push", а не "pull", например, при загрузке исправления изнутри виртуальной машины или при установке исправления, сделанного на компьютере пользователя (где разработчик не вправе устанавливать демон ssh, не говоря уже о том, чтобы знать пароль пользователя).

Обычный обходной путь - вставка во временную ветку и затем слияние на другом компьютере - больше не требуется с этим патчем.

Новая опция:

updateInstead

Обновите рабочее дерево соответствующим образом, но откажитесь сделать это, если есть какие-либо незафиксированные изменения.


commit 4d7a5ce добавляет больше тестов и упоминает:

В предыдущем тесте тестировался только тот случай, когда путь, подлежащий обновлению с помощью функции Push-to-deploy, имеет несовместимое изменение в рабочем дереве цели, которое уже добавлено в индекс, но сама функция хочет, чтобы рабочее дерево было намного чище, чем то, что тестируется.

Добавьте еще несколько тестов, чтобы защитить функцию от будущих изменений, которые ошибочно (с точки зрения изобретателя функции) ослабляют требование чистоты, а именно:

  • Изменение только в рабочем дереве, но не в индексе, все еще должно быть защищено;
  • Не отслеживаемый файл в рабочем дереве, который будет перезаписан Push-to-deploy, должен быть защищен;
  • Изменение, которое делает файл идентичным тому, что выдвигается, все же является изменением, которое необходимо защитить (т.е. требование к чистоте функции является более строгим, чем требование извлечения).

Кроме того, проверьте, что изменение только статистики в рабочем дереве не является причиной отклонения Push-to-deploy.

с Git <2.3.0, февраль 2015

Наиболее распространенный подход - создать пустой репозиторий из не-пустого репозитория, и иметь удаленные/локальные не-голые репозитории git, указывающие на только что созданный пустой репозиторий.

74
VonC

Это та же проблема, что и Этот вопрос , решение состоит в том, чтобы использовать git init --bare или git clone --bare.

13
pluskid