Git-Chmod-Problem: Checkout verschraubt Exec-Bit

Git-Chmod-Problem: Checkout verschraubt Exec-Bit

Unter Ubuntu und Debian wird bei den zuletzt übermittelten Dateien das Ausführungsbit gesetzt, wenn ich anschließend einen Checkout versuche. Das 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 reinrutscht? core.filemodeist auf gesetzt true.

Ich habe die Datei während des Branch-Wechsels in vim geöffnet, falls das irgendwie wichtig ist.

Nachtrag 1:Es ist der Checkout, wo die Berechtigungen vermasselt sind. 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.

Nachtrag 2:Dies geschieht übrigens für jede Datei in diesem Repository, die ich committe. Nach dem erfolgreichen Commit kann ich ohne Berechtigungsfehler nicht mehr zwischen Zweigen wechseln.

Antwort1

Ich bin kein Git-Benutzer, aber ich glaube, dass Git die gesamte Dateiberechtigungsmaske speichert.

Das bedeutet, dass Sie die Datei einmal als ausführbar markiert haben, was Git dann übernommen und im Repository repliziert hat. Daher müssen Sie vor dem Commit die Berechtigungsmaske der Datei selbst ändern.

Um Git dazu zu bringen, solche Änderungen zu ignorieren, verwenden Sie

git config core.filemode false

Ausgit-konfiguration(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.

Antwort2

Haben Sie überprüft, ob es einen benutzerdefinierten Hook gibt, der während des Commits oder Checkouts ausgeführt wird? Möglicherweise gibt es benutzerdefinierte Hooks, die Ihre Dateien manipulieren. Überprüfen Sie denGithooks-Manpage.

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

Antwort3

hast du versucht, git commit -m 'mode is 644' Datei auf Zweig dev-branch

für mich sieht es so aus, als ob Sie die Berechtigungen auf dem Hauptzweig ändern und dann den Entwicklungszweig mit der falschen Berechtigung herunterziehen, wodurch Ihre lokale Berechtigung überschrieben wird. Dann versuchen Sie erneut, ein Commit durchzuführen. Entweder klonen, ändern, committen, zusammenführen; oder versuchen Sie, die Datei einzeln mit einem einzigen Datei-Commit in die Entwicklungs-Abteilung zu ändern und dann zusammenzuführen.

Antwort4

Unter diesen Links finden Sie gute Antworten.

https://stackoverflow.com/questions/9027584/wie-man-den-dateimodus-auf-github-ändert

Und

https://stackoverflow.com/questions/1611211/wie kann ich Änderungen im Git-Accept-Modus vornehmen, ohne alle Textänderungen zu akzeptieren?

Dies ist im Wesentlichen notwendig git update-index --chmod=(+|-)x <file>und fügt eine Änderung hinzu, die Sie dann festschreiben und übertragen müssen, damit die Berechtigungen hinzugefügt/entfernt werden.

verwandte Informationen