Проблема з Git Chmod: Біт виконати гвинти виконувати


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: Це, до речі, відбувається з кожним файлом у цьому сховищі, який я ввожу. Після успішної фіксації я не можу перемикати гілки без дозволу.


Ви перевірили дозволи на кроці # напевно все нормально ...
RobotHumans

Я згоден тут. У програмі dev-branch, "git-log master ... HEAD - file", і подивіться, чи змінилося щось між гілкою та тепер цим файлом.
Юріїсмайстер

@ aking1012: Так, у цей момент режими файлів уже змінилися. Я оновлю питання.
Boldewyn

@yuriismaster: git-logвзагалі не відображає жодного результату, ні для комбінації master, dev-branchні HEAD(що дивно, чи не так? Не повинна команда друкувати останнє повідомлення з фіксації master?)
Boldewyn

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.

1
Насправді я дуже намагаюся ввести файли з правильними дозволами. Я навіть повторно вчинив усі файли після того, як chmod'ing їх. Оскільки я час від часу працюю над Windows (не з цим репо), я знаю про це core.fileMode, але сподівався, що зможу його залишити true.
Boldewyn

Це може бути навіть помилка в git під час роботи над тим, що вони називають "зламані файлові системи". Немає зламаних файлових систем, лише зламане програмне забезпечення.
harrymc

4
я повинен погодитися з розробниками git, що жир порушується
RobotHumans

3
Гаразд, це була файлова система. Я не міг відтворити його на іншій машині, де каталог монтується через NFS. На головній машині це, як я вже сказав, CIFS. Коли я запитав у списку розсилки git, я отримав відповідь, що CIFS порушено щодо бітів виконання. Чорт!
Boldewyn


3

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

Гачки - це в основному невеликі програми, що викликаються git на певних заходах (фіксація, оформлення замовлення тощо).


Добре спробуйте, але мій .git/hooksкаталог не зачіпається.
Boldewyn

1

ви спробували git commit -m 'режим 644' файл у відділенні dev-branch

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


1
Насправді я ніколи не торкаюся дозволів у оригінальному сценарії. Всі зміни дозволу здійснюються git на кроці "оформлення замовлення".
Болдевін

... тобто я кілька chmodразів робив файли, але, на жаль, не можу згадати, якщо проблема почала виникати відразу після цього. Я думаю, це не сталося.
Boldewyn

Я намагався повторити вам проблему, і я не можу
RobotHumans

Це тому, що ви не працюєте на встановленому CIFS ;-). Я забув +1 за спробу, дякую!
Boldewyn

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>і це додасть зміни, які вам потім потрібно зробити і натиснути, щоб додати / видалити дозволи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.