Problem z Git chmod: Bit kasujący śruby wykonawcze


10

W systemach Ubuntu i Debian ostatnio zatwierdzone pliki są ustawiane pod kątem bitów wykonania, gdy próbuję później dokonać płatności. To dość dziwne i doprowadza mnie do szału:

$ 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

Czy ktoś ma pomysł, kiedy i dlaczego kawałek wykonania się wślizguje? core.filemodejest ustawiony na true.

Mam plik otwarty w vimie podczas zmiany gałęzi, jeśli to w jakiś sposób ważne.

Dodatek 1: Jest to kasa, w której uprawnienia są pomieszane. Mogę grać w tę grę przez cały czas:

$ 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.

Dodatek 2: Nawiasem mówiąc, dzieje się tak dla każdego pliku w tym repozytorium, który zatwierdzam. Po udanym zatwierdzeniu nie mogę zmienić gałęzi bez zepsutego pozwolenia.


Czy sprawdziłeś uprawnienia w kroku # najwyraźniej wszystko w porządku ...
RobotHumans

Zgadzam się tutaj. W dev-branch 'git-log master ... HEAD - file' i sprawdź, czy coś się zmieniło między gałęzią a teraz w tym pliku.
yuriismaster

@ aking1012: Tak, w tym momencie tryby plików już się zmieniły. Zaktualizuję pytanie.
Boldewyn,

@yuriismaster: git-lognie wykazuje wyjście w ogóle, ani dla kombinacji master, dev-branchalbo HEAD(? co jest dziwne, prawda nie powinna polecenie wydrukowania ostatni commit wiadomość z master?)
Boldewyn

2
Na jakim systemie plików jesteś?
maska ​​bitowa

Odpowiedzi:


12

Nie jestem użytkownikiem Git, ale uważam, że Git przechowuje całą maskę uprawnień do plików.

Oznacza to, że raz ustawiłeś plik na wykonywalny, który Git pobierał i replikował w repozytorium. Dlatego przed zatwierdzeniem musisz zmienić maskę uprawnień do pliku.

Aby Git zignorował takie zmiany, użyj

git config core.filemode false

Z 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
Właściwie staram się zatwierdzić pliki z odpowiednimi uprawnieniami. Powtórzyłem nawet wszystkie pliki po ich chmod'owaniu. Ponieważ od czasu do czasu pracuję w systemie Windows (choć nie z tym repozytorium), wiem o tym core.fileMode, ale miałem nadzieję, że mogę go opuścić true.
Boldewyn,

Może nawet być błędem w git podczas pracy nad tak zwanymi „uszkodzonymi systemami plików”. Nie ma uszkodzonych systemów plików, tylko uszkodzone oprogramowanie.
harrymc

4
Muszę zgodzić się z twórcami git, że tłuszcz jest zepsuty
RobotHumans

3
OK, to był system plików. Nie mogłem go odtworzyć na innym komputerze, na którym katalog jest podłączony przez NFS. Na głównej maszynie jest, jak powiedziałem, CIFS. Kiedy zapytałem na liście mailowej git, otrzymałem odpowiedź, że CIFS jest uszkodzony w odniesieniu do bitów wykonania. Cerować!
Boldewyn,


3

Czy sprawdziłeś, czy istnieje niestandardowy zaczep, który jest wykonywany podczas zatwierdzania lub pobierania? Mogą istnieć pewne niestandardowe zaczepy modyfikujące twoje pliki. Sprawdź stronę githooks .

Haki to w zasadzie małe programy wywoływane przez git przy określonych zdarzeniach (zatwierdzanie, kasowanie itp.).


Dobra próba, ale mój .git/hookskatalog jest nietknięty.
Boldewyn,

1

próbowałeś git commit -m 'tryb to 644' plik w gałęzi dev-branch

dla mnie wygląda na to, że to, co się dzieje, zmieniasz uprawnienia na main, a następnie ściągasz gałąź programistów, która ma złe uprawnienia, blokując twoje lokalne pozwolenie. następnie próbuję ponownie zatwierdzić. albo klonować, zmieniać, zatwierdzać, łączyć; lub spróbuj zmienić plik indywidualnie za pomocą pojedynczego zatwierdzenia pliku w dev, a następnie scal


1
Właściwie nigdy nie dotykam uprawnień w oryginalnym scenariuszu. Wszelkie zmiany uprawnień są wykonywane przez git w kroku „kasy”.
Boldewyn,

... to znaczy chmodraz zrobiłem trochę na plikach, ale niestety nie pamiętam, czy problem zaczął się pojawiać zaraz potem. Myślę, że nie.
Boldewyn,

próbowałem odtworzyć problem i nie mogę
RobotHumans

To dlatego, że nie pracujesz na zamontowanym CIFS ;-). Zapomniałem +1 za próbę, dzięki!
Boldewyn

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.