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

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

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

$ 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:Кстати, это происходит для каждого файла в этом репозитории, который я коммитю. После успешного коммита я не могу переключать ветки без проблем с разрешениями.

решение1

Я не пользователь 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.

решение2

Вы проверили, есть ли пользовательский хук, который выполняется во время фиксации или проверки? Возможно, есть некоторые пользовательские хуки, которые вмешиваются в ваши файлы. Проверьтестраница руководства githooks.

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

решение3

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

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

решение4

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

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

и

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

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

Связанный контент