Ich habe ein Projekt, in dem ich den Dateimodus mit chmod
während der Entwicklung auf 777 ändern muss, das sich aber im Haupt-Repo nicht ändern sollte.
Git nimmt chmod -R 777 .
alle Dateien auf und markiert sie als geändert. Gibt es eine Möglichkeit, Git dazu zu bringen, Änderungen am Modus zu ignorieren, die an Dateien vorgenommen wurden?
git diff
, und deshalb wollen ihre Git - Konfigurationsdateien nicht ändern: Sie verwenden könnengit diff -G.
pro Zeds Antwort hier .Antworten:
Versuchen:
Von git-config (1) :
Mit dem
-c
Flag kann diese Option für einmalige Befehle festgelegt werden:Das
--global
Flag macht es zum Standardverhalten für den angemeldeten Benutzer.Änderungen der globalen Einstellung werden nicht auf vorhandene Repositorys angewendet. Zusätzlich
git clone
undgit init
explizitcore.fileMode
auftrue
Config im Repo wie in diskutiert Git globalen core.fileMode falsch überschrieben lokal auf KlonWarnung
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 denken Sie, dass Sie diese Einstellung benötigen, weil Sie so etwas getan habenchmod -R 777
, um alle Ihre Dateien ausführbar zu machen. In den meisten Projekten werden die meisten Dateien jedoch nicht benötigt und sollten aus Sicherheitsgründen nicht ausführbar sein .Der richtige Weg, um diese Art von Situation zu lösen, besteht darin, Ordner- und Dateiberechtigungen getrennt zu behandeln.
Wenn Sie dies tun, müssen Sie es nie verwenden
core.fileMode
, außer in sehr seltenen Umgebungen.quelle
git config --global core.filemode false
, müssen Sie dies nur einmal für alle Repos tun.git config
Befehl schreibt die Einstellung in die richtige Konfigurationsdatei (.git/config
nur für das aktuelle Repository oder~/.gitconfig
bei Verwendung mit--global
).Modusänderung im Arbeitsbaum rückgängig machen:
Oder in Mingw-Git
quelle
-d'\n'
Teil weg,xargs
da dies ein unzulässiges Argument ist (und nicht benötigt wird).tr '\n' '\0'
und dann das-0
Argument an xargs verwenden, um NUL als Trennzeichen zu verwenden.tr
Ding hat funktioniert! Hier ist der vollständige Befehl für OSX:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
Wenn Sie diese Option für alle Ihre Repos festlegen möchten, verwenden Sie die
--global
Option.Wenn dies nicht funktioniert, verwenden Sie wahrscheinlich eine neuere Version von git. Probieren Sie die
--add
Option aus.Wenn Sie es ohne die Option --global ausführen und Ihr Arbeitsverzeichnis kein Repo ist, erhalten Sie
quelle
--add
, wie ingit config --add --global core.filemode false
Wenn
funktioniert bei Ihnen nicht, machen Sie es manuell:
CD in .git Ordner:
Bearbeiten Sie die Konfigurationsdatei:
Ändern Sie true in false
->
Speichern, beenden, in den oberen Ordner wechseln:
Schalte den Git wieder ein
du bist fertig!
quelle
.git/config
, reicht ein einfachesgit config core.fileMode false
im Stammverzeichnis Ihres Projekts aus. Wenn Sie die Konfigurationsdatei bearbeiten, sollten Sie die Direktive besser vollständig entfernen, damit die globale übernommen wird.global
Option entspricht genau der manuellen Bearbeitung von .git / config~/.gitconfig
~/project/.git/config
git init
sollten wir den Dateimodus wieder auf true setzen?Hinzufügen zur Antwort von Greg Hewgill (Verwendung der
core.fileMode
Konfigurationsvariablen):Sie können die
--chmod=(-|+)x
Option git update-index (Low-Level-Version von "git add") verwenden, um die Ausführungsberechtigungen im Index zu ändern. Dort wird sie abgerufen, wenn Sie "git commit" (und nicht "git commit -a" verwenden ").quelle
Sie können es global konfigurieren:
git config --global core.filemode false
Wenn dies für Sie nicht funktioniert, liegt der Grund möglicherweise darin, 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
quelle
git config -l
Wenn Sie den Befehl chmod bereits verwendet haben, überprüfen Sie den Unterschied zwischen den Dateien. Er zeigt den vorherigen Dateimodus 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 jetzt core.fileMode in der Konfigurationsdatei entweder mit dem Befehl oder manuell auf false.
Wenden Sie dann den Befehl chmod an, um die Berechtigungen aller Dateien zu ändern, z
und setzen Sie core.fileMode erneut auf true.
Für Best Practices halten Sie core.fileMode nicht immer auf false.
quelle
For best practises don't Keep core.fileMode false always
Was meinst du, das solltest du erklären.For best practises don't Keep core.fileMode false always.
Einige Dateisysteme (z. B. FAT) unterstützen keine Dateiberechtigungen, daher meldet das Betriebssystem einen Standardwert (766 auf meinem System sowieso). In diesem Fallcore.filemode
ist dies in der lokalen Konfiguration unbedingt erforderlich, es sei denn, Sie möchten den Commit-Verlauf mit unnötigen und unbeabsichtigten Berechtigungsänderungen aufblähencore.filemode=false
, ignoriert git Ausführungsbitänderungen, ohne dass lokale Berechtigungen geändert werden müssen. Sofern Sie dem Index noch keine Berechtigungsänderungen hinzugefügt haben, verpassen Sie in diesem Fall den Schritt, den Siegit add
nach dem Ausschalten benötigen würdencore.filemode
.Durch Definieren des folgenden Alias (in ~ / .gitconfig) können Sie den Befehl fileMode per git einfach vorübergehend deaktivieren:
Wenn diesem Alias der Befehl git vorangestellt wird, werden die Änderungen im Dateimodus nicht mit Befehlen angezeigt, die sie sonst anzeigen würden. Zum Beispiel:
quelle
Wenn Sie den Dateimodus in Konfigurationsdateien rekursiv auf false setzen möchten (einschließlich Submodule):
find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'
quelle
git submodule foreach git config core.fileMode false
Einfache Lösung:
Klicken Sie auf diesen einfachen Befehl im Projektordner ( Ihre ursprünglichen Änderungen werden nicht entfernt) . Es werden nur Änderungen entfernt , die vorgenommen wurden , während Sie die Berechtigung für den Projektordner geändert haben
Befehl ist unten:
git config core.fileMode false
Warum diese alle unnötigen Dateien geändert werden: weil Sie die Projektordnerberechtigungen mit commend sudo chmod -R 777 ./yourProjectFolder geändert haben
Wann werden Sie Änderungen überprüfen, was Sie nicht getan haben? Sie fanden wie unten bei der Verwendung von Git Diff Dateiname
quelle
Das funktioniert bei mir:
oder umgekehrt, abhängig von Ihrem Betriebssystem
quelle