Verwenden von Gitignore zum Ignorieren (aber nicht Löschen) von Dateien

97

Ich habe ein tmp-Verzeichnis in meinem Git-Repo, das ich gerne noch existieren würde, aber ignoriert werde. Ich habe es hinzugefügt .gitignore, git statuserzähle mir aber trotzdem über Änderungen an Dateien in diesem Verzeichnis. Ich habe es versucht git rm -r --cached, aber das entfernt es aus dem Remote-Repo. Wie kann ich die Verfolgung von Änderungen an diesem Verzeichnis beenden, es aber trotzdem zulassen? Ich muss dies auch für 1 Datei tun, aber Änderungen daran werden auch git statusnach dem .gitignoreErstellen angezeigt. Was soll ich machen?

21312312
quelle
1
Bitte schreiben Sie auf, wie genau Ihre .gitignore-Datei aussieht.
Kdehairy

Antworten:

182

Stattdessen .gitignorekönnen Sie das lokale Git-Repository aktualisieren, indem Sie den folgenden Befehl ausführen:

git update-index --assume-unchanged <file>

In diesem Fall wird eine Datei im Ursprungs-Repo verfolgt. Sie können es in Ihrem lokalen Repo ändern und Git wird es niemals als geändert markieren. Lesen Sie mehr unter:

Ducin
quelle
22
Meine Liebe zu Git hat sich vielleicht gerade verdoppelt.
Mark Fox
2
Dies sollte die akzeptierte Antwort sein. Danke, dass du darauf verlinkt hast.
Gowiem
4
Gibt es eine Möglichkeit, dies auf das Remote-Repo zu übertragen?
Brian Ortiz
2
hmm ich würde eine Datei lieber als "es ist keine Git-Datei, synchronisiere sie niemals mit Git, auch nicht in einem anderen Repo"
markieren
11
Sie können es mit zurücksetzen git update-index --no-assume-unchanged <file>. Wenn Sie sie auflisten möchten git ls-files -v | grep '^h'.
Sanghyun Lee
12

Das Ignorieren von Änderungen, die an Dateien vorgenommen wurden, während sie existieren, ist der genaue Zweck von .gitignore. Fügen Sie also die Dateien (oder Verzeichnisse) hinzu.gitignore ist das einzige, was Sie tun müssen.

Ihr Problem ist jedoch, dass git bereits die Dateien verfolgt, die Sie ignorieren möchten, und .gitignorenicht für verfolgte Dateien gilt. Die einzige Möglichkeit, dieses Tracking zu stoppen, besteht darin, git anzuweisen, sie zu entfernen. Durch die Nutzunggit rm --cached verhindern Sie, dass git Ihre lokalen Dateien löscht, aber jedes andere Repository, das Ihre Änderungen erhält, wendet das Entfernen an. Ich glaube nicht, dass es eine Möglichkeit gibt, dies aus Ihrem eigenen Repository heraus zu vermeiden. Sie müssen etwas in den anderen Repositorys tun oder akzeptieren, dass die Dateien entfernt werden.

Um zu verhindern, dass das andere Repository entfernt wird, können Sie:

  • (offensichtlich) die Dateien irgendwo sichern, die Änderungen abrufen und die Dateien wiederherstellen,
  • oder auch git rm --cacheddie Dateien und Commit, bevor Sie Ihre Änderungen abrufen. Git wird die beiden Entfernungen gut zusammenführen, ohne die bereits nicht verfolgten Dateien zu berühren.
Michaël Witrant
quelle
6
Das muss nicht wahr sein ("Tracking beenden = Datei entfernen"). Sie können weiterhin eine Datei in einem Repo verfolgen lassen und keine Änderungen sehen, indem Sie : git update-index --assume-unchanged <file>. Werfen
ducin
Dies löste mein Problem, weil ich die Datei aus der git rm --cached <filename> -r Push- Repositorie in Git entfernen muss und nach diesem Push wieder in die Repositorie wechselt, damit die Datei entfernt wird
Vinicius Cardoso
7

Fügen Sie /am Ende des Verzeichnisnamens ein in Ihre .gitignoreDatei ein, d. H.

tmp/

Wenn Sie Dateien in diesem Verzeichnis verfolgt haben, müssen Sie git anweisen, diese zuerst zu vergessen (bevor Sie das Verzeichnis zur Ignorierliste hinzufügen). Angenommen, Sie haben nichts Wichtiges drin (dh Sie können es kratzen):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Neue Dateien in diesem Verzeichnis werden nicht verfolgt.

Die --cachedOption, git rmnur mit dem Index zu arbeiten (ausstehende Änderungen mehr oder weniger). Es hat keine Auswirkungen auf den Arbeitsbaum oder den Status dessen, was verfolgt wurde oder nicht.

Matte
quelle
Ich habe das. Beide the/dir/undthe/dir/*
21312312
Hey Mat, wenn ich so etwas wie / Media in verschiedenen Ordnern habe, die ich ignorieren möchte, ist das möglich? Also wie / 1 / Media, / 2 / Media, bis zu 99?
Nic
1

Es hört sich so an, als würden Sie versuchen, eine Datei zu verfolgen (z. B. index.php), sie einem Remote-Repository hinzuzufügen und dann die Verfolgung zu beenden, während Sie die Datei auf der Fernbedienung behalten (dh index.phpauf dem Remote-Repo unverändert bleiben, während Sie sie lokal ändern).

Soweit ich weiß, kann Git das nicht. Sie können entweder eine Datei verfolgen oder nicht. Wenn Sie eine Datei verfolgen, ist sie im Remote-Repo vorhanden und ändert sich, wenn Sie Änderungen daran festschreiben. Wenn Sie eine Datei nicht verfolgen, ist sie im Remote-Repo nicht vorhanden.

Da es mit git nicht möglich ist, genau das zu tun, was Sie wollen, gibt es möglicherweise andere Lösungen, abhängig von Ihrer genauen Situation. Warum möchten Sie beispielsweise nicht index.phpauf der Fernbedienung ändern, wenn Sie sie lokal ändern? Gibt es benutzerspezifische Einstellungen in der Datei? In diesem Fall können Sie Folgendes tun:

cp index.php index_template.php
git rm --cached index.php

Bearbeiten Sie nun index_template.php so, wie es auf dem Remote-Repo angezeigt werden soll. Fügen Sie Ihrer README-Datei etwas hinzu, um den Benutzern Ihres Repositorys mitzuteilen, dass sie nach dem Klonen index_template.php in index.php kopieren und entsprechend ihren Anforderungen bearbeiten müssen.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Wenn jemand Ihr Repo klont, muss er sein eigenes erstellen index.php. Sie haben es ihnen leicht gemacht: einfach kopieren index_template.phpzu index.phpund überarbeiten sie mit computerspezifischen Einstellungen.

Zypresse Frankenfeld
quelle