git update-index --assume-unverändert im Verzeichnis

101

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. cdin 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-indexfunktioniert 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.

Xander Dunn
quelle

Antworten:

173

git update-index möchte die Dateinamen in der Befehlszeile und nicht in der Standardeingabe.

Schritt 1:

cd in den Ordner, den Sie annehmen möchten, ist unverändert

Schritt 2:

Sie können entweder Folgendes tun:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

oder

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

In beiden Fällen sind Dateinamen mit Leerzeichen jedoch problematisch. Wenn Sie diese haben, können Sie dies verwenden:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Bearbeiten: Eingaben von @MatthewScharley bezüglich git ls-files -z.

Windows-Befehle

Hinweis: Wenn Sie unter Windows arbeiten, verwenden Sie Git Bash , um diese Befehle auszuführen

Twalberg
quelle
2
Zu Ihrer Information, dass `| tr '\ n' '' `Bit ist nicht erforderlich.
Václav Slavík
7
@twalberg: Sie könnten einfach verwendengit ls-files -z
Matthew Scharley
2
@twalberg Wie man diesen Befehl rückgängig macht "git ls-files -z | xargs -0 git update-index --assume-unverändert"
Mohamed Hussain
3
@ MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, ich würde denken ...
Twalberg
1
git ls-files -z | git update-index -z --stdinist sauberer.
Jed
22

Der findBefehl von GNU Findutils verfügt über eine -execOption, 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 path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find nimmt jedes Argument nach -execbis ;(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 finddie Ü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 findBefehls. YMMV.

sie rufen ihn an
quelle
2
-execist 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.
Tom Fenech
16

Fügen Sie den Verzeichnisnamen hinzu .git/info/exclude. Dies funktioniert für nicht verfolgte Dateien.

Steve Pitchers
quelle
Das funktioniert super! Wussten Sie, ob dies auch mit Dateien funktioniert?
Betomoretti
Aber das schiebt die nicht verfolgten Dateien nicht Github! Gibt es eine Möglichkeit, sie einfach aus den Aufzeichnungen zu ignorieren, aber tatsächlich in den Repos zu behalten?
Mahmoud Zalt
2

Ja,

git update-index --assume-unchanged

funktioniert nur mit Dateien, nicht mit Verzeichnissen. Ich denke, einer der schnelleren Wege:

cd dir
ls | xargs -l git update-index --assume-unchanged
Victor Perov
quelle
2
Anstatt zu verwenden cd, können Sie das Verzeichnis als letztes Argument übergeben : git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh