2882 Stimmen

Wie kann ich Git dazu bringen, Änderungen am Dateimodus (chmod) zu ignorieren?

Ich habe ein Projekt, in dem ich den Modus von Dateien mit chmod während der Entwicklung auf 777 gesetzt, was sich aber im Haupt-Repo nicht ändern sollte.

Git greift auf chmod -R 777 . und markiert alle Dateien als geändert. Gibt es eine Möglichkeit, Git dazu zu bringen, Änderungen am Modus zu ignorieren, die an Dateien vorgenommen wurden?

53 Stimmen

Dies ist hilfreich bei der Arbeit mit git unter Windows + Bash unter Ubuntu unter Windows

10 Stimmen

Für alle, die nur die Änderungen der Berechtigungen für einen bestimmten Aufruf von git diff und die daher ihre Git-Konfigurationsdateien nicht ändern wollen: Sie können git diff -G. per Zed's Antwort aquí .

4798voto

Greg Hewgill Punkte 882617

Versuchen Sie es:

git config core.fileMode false

De git-config(1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

El -c Flagge kann diese Option für einmalige Befehle gesetzt werden:

git -c core.fileMode=false diff

Die Eingabe der -c core.fileMode=false kann lästig sein, daher können Sie dieses Flag für alle Git-Repos oder nur für ein Git-Repo setzen:

# this will set your the flag for your user for all git repos (modifies `$HOME/.gitconfig`)
git config --global core.fileMode false

# this will set the flag for one git repo (modifies `$current_git_repo/.git/config`)
git config core.fileMode false

Zusätzlich, git clone y git init ausdrücklich festgelegt core.fileMode a true in der Repo-Konfiguration, wie in Git global core.fileMode false lokal beim Klonen überschrieben

Warnung

core.fileMode ist nicht die beste Praxis und sollte vorsichtig eingesetzt werden. Diese Einstellung bezieht sich nur auf das ausführbare Bit des Modus und niemals auf die Lese-/Schreibbits. In vielen Fällen denken Sie, dass Sie diese Einstellung brauchen, weil Sie etwas getan haben wie chmod -R 777 und macht alle Ihre Dateien ausführbar. Aber in den meisten Projekten die meisten Dateien müssen und sollten aus Sicherheitsgründen nicht ausführbar sein .

Der richtige Weg, um diese Art von Situation zu lösen, ist, die Ordner- und Dateiberechtigung separat zu behandeln, etwa mit:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Wenn Sie das tun, brauchen Sie nie mehr die core.fileMode außer in sehr seltenen Fällen.

327voto

yoda Punkte 4481

Änderung des Rückgängigmachmodus im Arbeitsbaum:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Oder in mingw-git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

Oder unter BSD/macOS

git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | tr '\n' '\0' | xargs -0 chmod -x
git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | tr '\n' '\0' | xargs -0 chmod -x

165voto

adrien Punkte 1623

Wenn Sie diese Option für alle Ihre Repos setzen wollen, verwenden Sie die --global Option.

git config --global core.filemode false

Wenn dies nicht funktioniert, verwenden Sie wahrscheinlich eine neuere Version von git, also versuchen Sie die --add Option.

git config --add --global core.filemode false

Wenn Sie es ohne die Option --global ausführen und Ihr Arbeitsverzeichnis kein Repo ist, erhalten Sie

error: could not lock config file .git/config: No such file or directory

120voto

Sinan Eldem Punkte 5090

Wenn

git config --global core.filemode false

bei Ihnen nicht funktioniert, führen Sie es manuell durch:

cd into yourLovelyProject folder

cd in den Ordner .git:

cd .git

Bearbeiten Sie die Konfigurationsdatei:

nano config

true in false ändern

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

speichern, beenden, zum oberen Ordner gehen:

cd ..

den Git neu starten

git init

Sie sind fertig!

58voto

Jakub Narębski Punkte 286531

Hinzufügen zu Antwort von Greg Hewgill (der Verwendung core.fileMode Konfigurationsvariable):

Sie können verwenden --chmod=(-|+)x Option von git update-index (Low-Level-Version von "git add"), um die Ausführungsrechte im Index zu ändern, von wo aus sie bei Verwendung von "git commit" (und nicht von "git commit -a") übernommen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X