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