wake-up-neo.net

Wie bringe ich Git dazu, Änderungen im Dateimodus (chmod) zu ignorieren?

Ich habe ein Projekt, in dem ich während der Entwicklung den Dateimodus mit chmod auf 777 ändern muss, das sich aber im Haupt-Repo nicht ändern sollte.

Git nimmt chmod -R 777 . auf und markiert alle Dateien als geändert. Gibt es eine Möglichkeit, Änderungen am Git-Ignoriermodus vorzunehmen, die an Dateien vorgenommen wurden?

2131
Marcus Westin

Versuchen:

git config core.fileMode false

From 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).

Mit dem Flag -c können Sie diese Option für einmalige Befehle festlegen:

git -c core.fileMode=false diff

Und das --global -Flag macht es zum Standardverhalten für den angemeldeten Benutzer.

git config --global core.fileMode false

Änderungen der globalen Einstellung werden nicht auf vorhandene Repositorys angewendet. Sie müssen entweder das Repository erneut klonen oder git init ausführen. Dies ist in vorhandenen Repositorys sicher. Es werden keine Dinge überschrieben, die bereits vorhanden sind.

Warnung

core.fileMode ist nicht die beste Vorgehensweise und sollte sorgfältig angewendet werden. Diese Einstellung deckt nur das ausführbare Bit des Modus und niemals die Lese-/Schreibbits ab. In vielen Fällen glauben Sie, dass Sie diese Einstellung benötigen, weil Sie so etwas wie chmod -R 777 gemacht haben und alle Ihre Dateien ausführbar gemacht haben. In den meisten Projekten müssen und sollten die meisten Dateien aus Sicherheitsgründen nicht ausführbar sein .

Der richtige Weg, um diese Art von Situation zu lösen, besteht darin, die Ordner- und Dateiberechtigungen getrennt zu behandeln.

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

In diesem Fall müssen Sie core.fileMode nur in sehr seltenen Umgebungen verwenden.

3527
Greg Hewgill

modusänderung im Arbeitsbaum rückgängig machen:

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
264
yoda

Wenn Sie diese Option für alle Ihre Repos festlegen möchten, verwenden Sie die Option --global.

git config --global core.filemode false

Wenn dies nicht funktioniert, verwenden Sie wahrscheinlich eine neuere Version von git. Versuchen Sie es mit der Option --add.

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
126
adrien

Wenn

git config --global core.filemode false

funktioniert bei Ihnen nicht, machen Sie es manuell:

cd into yourLovelyProject folder

cD in .git Ordner:

cd .git

bearbeiten Sie die Konfigurationsdatei:

nano config

ändere wahr in falsch

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

speichern, beenden, in den übergeordneten Ordner wechseln:

cd ..

reinit the Git

git init

du bist fertig!

75
Sinan Eldem

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

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

51
Jakub Narębski

Sie können es global konfigurieren:

git config --global core.filemode false

Wenn das oben Genannte bei Ihnen nicht funktioniert, liegt dies möglicherweise daran, dass Ihre lokale Konfiguration die globale Konfiguration überschreibt.

Entfernen Sie Ihre lokale Konfiguration, damit die globale Konfiguration wirksam wird:

git config --unset core.filemode

Alternativ können Sie Ihre lokale Konfiguration auf den richtigen Wert ändern:

git config core.filemode false

35
Tyler Long

Wenn Sie bereits den Befehl chmod verwendet haben, prüfen Sie den Unterschied zwischen Dateien. Er zeigt den vorherigen und den aktuellen Dateimodus an, z.

neuer Modus: 755

alter Modus: 644

stellen Sie den alten Modus aller Dateien mit dem folgenden Befehl ein

Sudo chmod 644 .

setzen Sie nun core.fileMode in der Konfigurationsdatei entweder mit dem Befehl oder manuell auf false.

_git config core.fileMode false
_

wenden Sie dann den Befehl chmod an, um die Berechtigungen aller Dateien zu ändern, z

_Sudo chmod 755 .
_

und setzen Sie core.fileMode erneut auf true.

_git config core.fileMode true
_

Bewahren Sie core.fileMode für Best Practices nicht immer auf.

20
Kishor Vitekar

Durch Definieren des folgenden Alias ​​(in ~/.gitconfig) können Sie den Befehl fileMode per git einfach vorübergehend deaktivieren:

[alias]
nfm = "!f(){ git -c core.fileMode=false [email protected]; };f"

Wenn dieser Alias ​​dem Befehl git vorangestellt wird, werden die Änderungen des Dateimodus nicht mit Befehlen angezeigt, die sie andernfalls anzeigen würden. Zum Beispiel:

git nfm status
16
Ville

Wenn Sie den Dateimodus in Konfigurationsdateien rekursiv (einschließlich Submodulen) auf false setzen möchten: find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

13
dryobs

Einfache Lösung:

Drücken Sie diese Einfacher Befehl im Projektordner (es werden nicht Ihre ursprünglichen Änderungen entfernt) ... es wird nur Änderungen entfernen das war - erledigt während Sie geändert haben Projektordner-Berechtigung

Befehl ist unten:

git config core.fileMode false

Warum diese unnötige Datei geändert wird: weil Sie die Projektordner-Berechtigungen mit commend geändert haben Sudo chmod -R 777 ./yourProjectFolder

wann werden Sie Änderungen überprüfen, die Sie nicht vorgenommen haben? Sie fanden wie folgt bei der Verwendung von Git Diff Dateiname

old mode 100644
new mode 100755
2
ngCourse

Das funktioniert bei mir:

find . -type f -exec chmod a-x {} \;

oder umgekehrt, abhängig von Ihrem Betriebssystem

find . -type f -exec chmod a+x {} \;
1
Martin Volek