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.filemode
jest 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.
git-log
nie wykazuje wyjście w ogóle, ani dla kombinacjimaster
,dev-branch
alboHEAD
(? co jest dziwne, prawda nie powinna polecenie wydrukowania ostatni commit wiadomość zmaster
?)Odpowiedzi:
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
Z git-config (1) :
źródło
core.fileMode
, ale miałem nadzieję, że mogę go opuścićtrue
.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.).
źródło
.git/hooks
katalog jest nietknięty.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
źródło
chmod
raz zrobiłem trochę na plikach, ale niestety nie pamiętam, czy problem zaczął się pojawiać zaraz potem. Myślę, że nie.Istnieją dobre odpowiedzi pod tymi linkami.
/programming/9027584/how-to-change-the-file-mode-on-github
i
/programming/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes
Zasadniczo musisz,
git update-index --chmod=(+|-)x <file>
a to doda zmianę, którą następnie musisz zatwierdzić i wcisnąć, aby dodać / usunąć uprawnienia.źródło