Git init: fatal: не удалось установить для «core.filemode» значение «false» - PullRequest
0 голосов
/ 01 мая 2018

Использование Team City для выезда из Git Repo. (Gitlabs, если это имеет значение)

Начните с пустой директории сборки. Получите эту ошибку:

fatal: не удалось установить для «core.filemode» значение «false»

(Запуск на компьютере с Windows, если это имеет значение)

Пользователь, на котором работает Team City, был на всякий случай изменен на Администратора.

Каталог .Git не является допустимым репо при выходе из этой команды.

Стирание всего рабочего каталога не помогает.

Случайно приходит и уходит ...

И это: git config --global --replace-all core.fileMode false

Ничего не делает полезного - с или без --replace-all и запускается от имени администратора или другого пользователя (если вы измените «false» на «true», вы получите ту же ошибку, если вы измените ее на «falseCD») он изменяет ошибку на недопустимое значение - так ясно, что он ее меняет.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 09 мая 2018

Traderhunt Games проследили это до некоторой антивирусной программы , что имеет смысл. Причина связана с процессом, который Git использует для обновления записи конфигурации.

Когда git config запускается и ему говорят об изменении одного или нескольких полей key = value конфигурации, например, при изменении core.filemode на false, способ, которым это реализуется, заключается в использовании трехэтапного процесса:

  1. Создайте новый пустой файл (.git/config.lock), используя вызов службы ОС, который создает файл, или происходит сбой, если файл уже существует. Если этот шаг завершается неудачно, это означает, что другая git config (или эквивалентная) команда уже выполняет , и мы должны дождаться ее завершения, прежде чем выполнить нашу собственную git config.

  2. Считайте существующий файл конфигурации, одну запись key = value за раз. Если ключ тот, который нам нужен, напишите значение new key = value, в противном случае скопируйте существующее key = value.

    Здесь есть некоторая причудливость с клавишами, которые могут повторяться, против клавиш, которые должны встречаться только один раз; см. параметры --replace-all и --unset-all до git config для получения подробной информации. Обратите внимание, что git config сама почти ничего не знает о большинстве пар ключ / значение, и вы можете изобретать свои собственные пары ключ / значение, если вы выбираете ключи, которые Git не использует сегодня и не будет использовать в будущем. (Как вы выясните, что Git будет и не будет использовать, скажем, в 2043 году, я понятия не имею. :-)) Основными исключениями являются некоторые значения core.*, которые git config делает понимают, и некоторые другие команды Git могут устанавливаться самостоятельно.

    (Обратите внимание, что --unset обрабатывается почти так же, как и замена. Как и замена, отличная от all, она только сбрасывает first совпадающую пару key = value. Отмена установки выполняется просто не пишите данный ключ, вместо записи замены key = value. Поскольку git config просто обрабатывает файл построчно, это легко сделать. Кроме того, если ваш key = value совершенно новый Git обрабатывает это, читая все строки, замечая, что он не заменил существующую key, и, следовательно, добавляет новую строку key = value. Это немного усложняется тем фактом, что ключи перечислены по разделам, но сама логика достаточно проста.)

  3. Наконец, прочитав всю существующую конфигурацию и полностью выписав новую (используя fflush и fsync и fclose и т. Д. При необходимости), git config вызывает службу ОС для переименуйте файл, чтобы переименовать .git/config.lock в .git/config. Здесь происходит сбой процесса в данном конкретном случае.

Переименование, если оно выполнено успешно, приводит в действие новую конфигурацию и , удаляя файл блокировки, как одну атомарную операцию: любая другая команда Git видит либо полную старую конфигурацию, из исходный файл .git/config или полная новая конфигурация из нового файла .git/config, который был известен при создании как .git/config.lock.

Другой вопрос StackOverflow спрашивает: Сможем ли мы когда-нибудь удалить открытый файл в Windows? принятый ответ включает в себя следующее утверждение: Антивирусный продукт, который не открытые файлы с включенным полным совместным доступом (включая удаление) содержат ошибки. Если это так, то есть если это конкретное программное обеспечение AV не открывается с флагом «разрешить удаление», и если такое программное обеспечение содержит ошибки, то это конкретное AV программное обеспечение является проблемой и глючит.

...