Проблема с git chmod: проверка винтов exec bit

10

Под Ubuntu и Debian последние зафиксированные файлы получают установленный бит выполнения, когда я пытаюсь оформить заказ позже. Это довольно странно и сводит меня с ума

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

Кто-нибудь знает, когда и почему проскальзывает бит выполнения? core.filemodeустановлен в true.

У меня есть файл, открытый в vim во время переключения веток, если это как-то важно.

Приложение 1: Это касса, где разрешения испорчены. Я могу играть в игру дальше и дальше:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

Приложение 2: Это происходит, кстати, для каждого файла в этом репозитории, который я фиксирую. После успешного коммита я не могу поменять ветки без провала разрешения.

Boldewyn
источник
Вы проверили разрешения на # вроде бы все нормально шаг ...
RobotHumans
Я согласен здесь. В dev-branch, 'git-log master ... HEAD - file' и посмотрите, изменилось ли что-нибудь между веткой и теперь в этом файле.
Юриймастер
@ aking1012: Да, в этот момент режимы файлов уже изменились. Я обновлю вопрос.
Болдевин
@yuriismaster: git-logвообще ничего не показывает, ни для комбинации master, dev-branchни HEAD(что странно, не так ли master?
Разве
2
На какой файловой системе вы работаете?
битовая

Ответы:

12

Не пользователь Git, но я считаю, что Git хранит маску разрешений всего файла.

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

Чтобы Git игнорировал такие изменения, используйте

git config core.filemode false

Из git-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.
harrymc
источник
1
На самом деле, я стараюсь зафиксировать файлы с правильными разрешениями. Я даже повторно зафиксировал все файлы после chmod'а их. Поскольку я время от времени работаю на Windows (но не с этим репо), я знаю об этом core.fileMode, но я надеялся, что смогу уйти true.
Болдевин
Это может быть даже ошибка в git при работе над тем, что они называют «сломанными файловыми системами». Там нет сломанных файловых систем, только сломанное программное обеспечение.
Harrymc
4
Я должен согласиться с разработчиками Git, что жир сломан
RobotHumans
3
ОК, это была файловая система. Я не смог воспроизвести его на другом компьютере, где каталог смонтирован через NFS. На основной машине это, как я уже сказал, CIFS. Когда я спросил в списке рассылки git, я получил ответ, что CIFS не работает в отношении битов выполнения. Штопать!
Болдевин
3

Вы проверяли, есть ли пользовательский хук, который выполняется во время фиксации или извлечения? Там могут быть некоторые пользовательские хуки, подделывающие ваши файлы. Оформить заказ на страницу githooks .

Хуки - это в основном маленькие программы, вызываемые git при определенных событиях (коммит, извлечение и т. Д.).

банди
источник
Хорошая попытка, но мой .git/hooksкаталог не тронут.
Болдевин
1

вы пробовали git commit -m 'mode is 644' файл на ветке dev-branch

мне кажется, что происходит то, что вы меняете права доступа на главном, а затем вытаскиваете ветку разработчика, у которой есть неправильное разрешение, и засоряете ваше локальное разрешение. затем пытаясь совершить снова. либо клонировать, изменить, совершить, объединить; или попробуйте изменить файл по отдельности с помощью одного файла в dev, а затем объединить

RobotHumans
источник
1
На самом деле, я никогда не касаюсь разрешений в исходном сценарии. Все изменения прав доступа выполняются git на этапе 'checkout'.
Болдевин
... то есть я chmodоднажды поработал над файлами, но, к сожалению, не могу вспомнить, если проблема начала возникать сразу после этого. Я думаю, это не так.
Болдевин
Я пытался повторить вашу проблему, и я не могу
RobotHumans
Это потому, что вы не работаете на смонтированном CIFS ;-). Я забыл +1 за попытку, спасибо!
Болдевин
1

Есть хорошие ответы по этим ссылкам.

/programming/9027584/how-to-change-the-file-mode-on-github

а также

/programming/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

По сути, вам нужно, git update-index --chmod=(+|-)x <file>и это добавит изменение, которое вам затем нужно будет зафиксировать и нажать для добавления / удаления разрешений.

dragon788
источник