git 1.7.12
Ich möchte alle Dateien unter einem bestimmten Verzeichnis als unverändert annehmen.
1) git update-index --assume-unchaged dir/
gibt "Pfad ignorieren".
2) git update-index --assume-unchaged dir/*
schlägt schnell fehl, weil es auf Dateien stößt, die nicht verfolgt werden, daher gibt es "fatal: Datei kann nicht markiert werden" und wird beendet.
3) Versuchen Sie, eine Liste der zu markierenden Dateien zu erstellen. cd
in das gewünschte Verzeichnis und dann ausführen git ls-files | tr '\n' ' ' | git update-index --assume-unchanged
. Dies erzeugt keine Fehlermeldung, markiert die Dateien jedoch nicht erfolgreich. Der erste Teil des Befehls git ls-files | tr '\n' ' '
erzeugt korrekt eine durch Leerzeichen getrennte Liste aller Dateien, die ich markieren möchte. Wenn ich die Ausgabe dieses Befehls kopiere und in die Befehlszeile einfüge, git update-index
funktioniert der Befehl. Was funktioniert nicht mit den Rohren?
Nein, es reicht mir nicht aus dir
, .gitignore hinzuzufügen . Ich brauche diese Dateien, um im Repository zu sein, aber unerwünschte Änderungen werden lokal vorgenommen, die ignoriert werden müssen, damit Benutzer Pulls ausführen können.
quelle
git ls-files -z
git ls-files -z | xargs -0 git update-index --no-assume-unchanged
, ich würde denken ...git ls-files -z | git update-index -z --stdin
ist sauberer.Der
find
Befehl von GNU Findutils verfügt über eine-exec
Option, mit der der größte Teil der Verwendung entfälltxargs
, obwohl die Syntax etwas Besonderes ist. Es geht jedoch perfekt mit Dateinamen mit Leerzeichen um.Dieser Befehl veranlasst git, anzunehmen, dass alle Dateien im und unter dem aufgelisteten Verzeichnis unverändert sind:
Find nimmt jedes Argument nach
-exec
bis;
(dem Sie entkommen müssen, damit Ihre Shell es nicht frisst) und führt es einmal für jede gefundene Datei aus, während{}
es durch den Namen der gefundenen Datei ersetzt wird (erneut in einfachen Anführungszeichen, damit Ihre Shell es nicht frisst).Wenn Sie
find
die Übereinstimmungskriterien verwenden (maximale Rekursionstiefe, ob die Übereinstimmung eine Datei oder ein Verzeichnis ist, ob der Dateiname mit einem Ausdruck übereinstimmt)-exec
, können Sie alle möglichen leistungsstarken Dinge tun.Nicht sicher über andere Implementierungen des
find
Befehls. YMMV.quelle
-exec
ist eine Standardoption . Sie können auch-exec git update-index --assume-unchanged {} +
(auch durch den Standard definiert) mehrere Dateinamen gleichzeitig an den Befehl übergeben, wodurch die Häufigkeit verringert wird, mit der der Befehl git aufgerufen wird.Fügen Sie den Verzeichnisnamen hinzu
.git/info/exclude
. Dies funktioniert für nicht verfolgte Dateien.quelle
Ja,
funktioniert nur mit Dateien, nicht mit Verzeichnissen. Ich denke, einer der schnelleren Wege:
quelle
cd
, können Sie das Verzeichnis als letztes Argument übergeben :git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
.