Git chmod Problem: Checkout Schrauben Exec Bit

10

Unter Ubuntu und Debian wird für die letzten festgeschriebenen Dateien das Ausführungsbit gesetzt, wenn ich danach einen Checkout versuche. Es ist ziemlich seltsam und macht mich verrückt:

$ 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

Hat jemand eine Idee, wann und warum das Ausführungsbit hineinschlüpft? core.filemodeist auf eingestellt true.

Ich habe die Datei während des Zweigwechsels in vim geöffnet, wenn das irgendwie wichtig ist.

Nachtrag 1: Es ist die Kasse, an der die Berechtigungen vermasselt werden. Ich kann das Spiel immer weiter spielen:

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

Anhang 2: Dies geschieht übrigens für jede Datei in diesem Repository, die ich festschreibe. Nach dem erfolgreichen Festschreiben kann ich die Zweige nicht ohne die Erlaubnis wechseln.

Boldewyn
quelle
Haben Sie die Berechtigungen im # scheinbar alles in Ordnung Schritt überprüft ...
RobotHumans
Ich stimme hier zu. In dev-branch 'git-log master ... HEAD - file' und prüfen Sie, ob sich zwischen dem Zweig und jetzt in dieser Datei etwas geändert hat.
Yuriismaster
@ aking1012: Ja, zu diesem Zeitpunkt haben sich die Dateimodi bereits geändert. Ich werde die Frage aktualisieren.
Boldewyn
@yuriismaster: git-logzeigt überhaupt keine Ausgabe, denn weder Kombination master, dev-branchoder HEAD(? das seltsam ist, ist nicht es sollte nicht der Befehl druckt die letzten Commit - Nachricht aus master?)
Boldewyn
2
Auf welchem ​​Dateisystem bist du?
Bitmaske

Antworten:

12

Kein Git-Benutzer, aber ich glaube, dass Git die gesamte Dateiberechtigungsmaske speichert.

Das bedeutet, dass Sie die Datei einmal auf die ausführbare Datei gesetzt haben, die Git aufgenommen und im Repository repliziert hat. Daher müssen Sie die Berechtigungsmaske der Datei selbst ändern, bevor Sie sie festschreiben.

Verwenden Sie, damit Git solche Änderungen ignoriert

git config core.filemode false

Von 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.
harrymc
quelle
1
Eigentlich bemühe ich mich, die Dateien mit den richtigen Berechtigungen festzuschreiben. Ich habe sogar alle Dateien erneut festgeschrieben, nachdem ich sie geändert habe. Da ich von Zeit zu Zeit unter Windows arbeite (allerdings nicht mit diesem Repo), weiß ich Bescheid core.fileMode, aber ich hoffte, es verlassen zu können true.
Boldewyn
Es könnte sogar ein Fehler in Git sein, wenn man an sogenannten "kaputten Dateisystemen" arbeitet. Es gibt keine kaputten Dateisysteme, nur kaputte Software.
Harrymc
4
Ich muss den Git-Entwicklern zustimmen, dass Fett gebrochen ist
RobotHumans
3
OK, es war das Dateisystem. Ich konnte es nicht auf einem anderen Computer reproduzieren, auf dem das Verzeichnis über NFS bereitgestellt wird. Auf der Hauptmaschine ist es, wie gesagt, CIFS. Als ich auf der Git-Mailingliste nachfragte, bekam ich die Antwort, dass CIFS in Bezug auf Ausführungsbits defekt ist. Verflixt!
Boldewyn
3

Haben Sie überprüft, ob es einen benutzerdefinierten Hook gibt, der beim Festschreiben oder Auschecken ausgeführt wird? Möglicherweise werden Ihre Dateien durch benutzerdefinierte Hooks manipuliert. Überprüfen Sie die Githooks-Manpage .

Hooks sind im Grunde genommen kleine Programme, die von git bei bestimmten Ereignissen (Commit, Checkout usw.) aufgerufen werden.

Bandi
quelle
Guter Versuch, aber mein .git/hooksVerzeichnis ist unberührt.
Boldewyn
1

Haben Sie versucht, git commit -m 'Modus ist 644' Datei auf Zweig dev-Zweig

Für mich sieht es so aus, als würden Sie die Berechtigungen für main ändern und dann den Entwicklungszweig mit der falschen Berechtigung herunterziehen, wodurch Ihre lokale Berechtigung beeinträchtigt wird. dann versuchen, erneut zu begehen. entweder klonen, ändern, festschreiben, zusammenführen; oder versuchen Sie, die Datei einzeln mit einem einzelnen Datei-Commit in dev zu ändern und dann zusammenzuführen

RobotHumans
quelle
Eigentlich berühre ich im ursprünglichen Szenario niemals Berechtigungen. Alle Berechtigungsänderungen werden von git im Schritt "Auschecken" vorgenommen.
Boldewyn
... das heißt, ich habe einige chmodMale an den Dateien gearbeitet, kann mich aber leider nicht erinnern, ob das Problem unmittelbar danach aufgetreten ist. Ich denke, das hat es nicht getan.
Boldewyn
Ich habe versucht, Sie Problem zu replizieren und ich kann nicht
RobotHumans
Das liegt daran, dass Sie nicht an einem gemounteten CIFS arbeiten ;-). Ich habe die +1 für den Versuch vergessen, danke!
Boldewyn