Den Inhalt eines bereits eingecheckten Verzeichnisses ignorieren?

226

Ich habe ein Git-Repository, das nur zum Speichern von Grafiken und Sounddateien verwendet wird, die in mehreren Projekten verwendet werden. Sie befinden sich alle in einem Verzeichnis ohne Unterverzeichnisse. Jetzt habe ich gerade ein Skript erstellt, um diese Assets aus einem anderen strukturierten Verzeichnis mit mehreren Ebenen von Unterverzeichnissen zu kopieren.

Jetzt möchte ich nur, dass die (Quell-) hierarchische Dateistruktur von git verfolgt wird und das (Ziel-) flache Verzeichnis (mit allen Dateien auf einem Stapel) ignoriert wird.

Ich habe das Zielverzeichnis zu .gitignore hinzugefügt, aber git verfolgt immer noch Änderungen daran. Ich dachte, wenn ich das Löschen der alten Datei im Zielverzeichnis festschreibe, hört git möglicherweise auf, den neuen Inhalt zu verfolgen (vom Skript kopiert), aber das tut es nicht.

Wie lasse ich git das Zielverzeichnis vergessen?

Felixyz
quelle
Wie lautet der Verzeichnisname und was haben Sie in .gitignore
user151019
1
Der Name ist DirNameIrrelevant und in .gitignore habe ich versucht, "DirNameIrrelevant", "DirNameIrrelevant /" und "DirNameIrrelevant / *"
Felixyz

Antworten:

524

Dieser Befehl bewirkt, dass git Ihr Verzeichnis und alle Dateien darunter aufzeichnet, ohne sie tatsächlich zu löschen:

git rm -r --cached <your directory>

Die -rOption bewirkt das Entfernen aller Dateien in Ihrem Verzeichnis.

Die --cachedOption bewirkt, dass die Dateien nur aus dem Git-Index entfernt werden, nicht aus Ihrer Arbeitskopie. Standardmäßig git rm <file>würde löschen <file>.

Gordon Wilson
quelle
Ah danke. Sehr nützlich, obwohl ich nicht verstehe, warum dies notwendig sein sollte (warum reicht es nicht aus, das Verzeichnis in .gitignore hinzuzufügen?). Können Sie mir sagen, wofür das --cached ist?
Felixyz
sicher. Ich habe meine Antwort geändert, um die beiden Optionen zu beschreiben.
Gordon Wilson
Warum dies notwendig ist, kann ich nur spekulieren. Ich würde vermuten, dass die Ersteller wollten, dass das Aufspüren von Dateien explizit erfolgt, um das Risiko zu verringern, dass wichtige Teile Ihres Projekts versehentlich aufgehoben werden. Ich stelle mir vor, dass es auch technische Gründe gibt.
Gordon Wilson
15
Der Gitignore wird verwendet, um zu bestimmen, welche nicht verfolgten Dateien Git kennt. Es hat keinen Einfluss auf Dateien, die bereits verfolgt werden. Wenn der Benutzer ansonsten ignorierte Dateien verfolgen möchte, lässt git sie zu. Dies kann entweder mit add -foder in Ihrer Situation erfolgen. Wie Gordon sagte, verhindert dies, dass Sie versehentlich eine Reihe von Dateien löschen - das Repository ist die Hauptliste, nicht der Gitignore. Auf diese Weise können Sie auch einige Dinge manuell verfolgen, die sonst von einer Platzhalterregel ignoriert würden, was ich als nützlich empfunden habe.
Cascabel
Die -rOption besteht nicht darin, "alle Dateien in Ihrem Verzeichnis zu entfernen", sondern die Unterverzeichnisse zu durchlaufen.
MrE
78

Wenn Sie eine nachverfolgte Datei benötigen (eingecheckt), aber keine weiteren Änderungen einer Datei nachverfolgen möchten, während Sie sie in Ihrem lokalen Repository sowie im Remote-Repository aufbewahren, können Sie Folgendes tun:

git update-index --assume-unchanged path/to/file.txt

Danach werden alle Änderungen an dieser Datei nicht mehr in angezeigt git status.

jone
quelle
1
Während OP möglicherweise nach einem Verzeichnis gefragt hat, ist dies genau das, wonach ich gesucht habe - ohne weitere Änderungen an einer einzelnen eingecheckten Datei; Vielen Dank!
Sdaau
1
Um ein Verzeichnis vollständig zu ignorieren, verwenden Sie 'git update-index --assume-unveränderter dirName / *'. Ich habe eine Weile gebraucht, um die Syntax zu finden, '*' wird hier benötigt
J-Dizzle
1
Wie würde man das umkehren?
Rhys
3
@ Rhys, um es umzukehren:git update-index --no-assume-unchanged dirname/**/*
JobJob
3

Bei einem Unterverzeichnis mit dem Namen blah/add to git scheinen beide der folgenden Funktionen zu funktionieren, um neue Dateien in zu ignorieren blah/. Zu .gitignore hinzugefügt:

blah 
blah/*
Stef
quelle
1

TL; DR, um Ihr Git-Repository zu bereinigen und sicherzustellen, dass ALLE Ihre ignorierten Elemente tatsächlich ignoriert werden:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Hinweis: Sie müssen kein Verzeichnis angeben. Auf diese Weise bereinigen Sie das gesamte Remote-Repo .

Um weiter zu gehen, lesen Sie dies

Ced
quelle
0

Ich bin mir nicht sicher, ob das zählt oder mich zu einem schlechten Menschen macht, aber hier ist es.

  1. Ich habe *Generated*zur Root-.gitignore-Datei hinzugefügt
  2. Ich habe die Dateien, die ich behalten möchte, als GeneratedFile.Whatever.ext eingereicht. Eingecheckt
  3. Ich habe beim Auschecken einen Git-Hook erstellt, um ein Powershell-Skript aufzurufen, das Folgendes tut:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Ich fühle mich ein bisschen schlecht mit mir selbst ... aber es funktioniert tatsächlich.

Steve
quelle
-2

Ok, es scheint, dass Sie zuerst einchecken müssen, wobei das Verzeichnis vollständig leer ist (weder alte noch neue Dateien), und alle danach hinzugefügten Dateien werden ignoriert. Wenn Sie die alten und neuen Dateien entfernen, bevor Sie sie festschreiben, werden die neuen Dateien dem Repo hinzugefügt, obwohl sie ignoriert werden sollten.

Zumindest hat das in dieser Situation bei mir funktioniert. Wäre immer noch großartig, wenn jemand mehr Einblick in die Vorgänge geben könnte.

Felixyz
quelle
1
Kurzversion von dem, was wir an anderer Stelle gesagt haben - der Gitignore beeinflusst, welche nicht verfolgten Daten Git kennt. Es hat keinen Einfluss darauf, was mit Daten geschehen soll, von denen Sie erzählt haben (z. B. angewiesen, sie dem Repository hinzuzufügen).
Cascabel
Es ist also sinnvoll, dass die Dateien, die verfolgt wurden und jetzt gelöscht werden, als solche verfolgt werden sollten, aber es macht für mich immer noch keinen Sinn, dass die hinzugefügten Dateien (falls vor dem nächsten Festschreiben ausgeführt) verfolgt werden, wohingegen wenn ich 1) ignorieren, 2) Dateien löschen, 3) festschreiben, 4) neue Datei hinzufügen, die neuen Dateien werden nicht verfolgt.
Felixyz