2068 Stimmen

Wie stoppt man die Verfolgung und ignoriert Änderungen an einer Datei in Git?

Ich habe ein Projekt geklont, das einige .csproj Dateien. Ich brauche/mag meine lokalen csproj Dateien, die von Git nachverfolgt werden (oder beim Erstellen eines Patches angezeigt werden), aber sie werden eindeutig im Projekt benötigt.

Ich habe hinzugefügt *.csproj zu meinem LOKALEN .gitignore aber die Dateien sind bereits in der Repo.

Wenn ich git status eingebe, zeigt es meine Änderungen an csproj die ich nicht im Auge behalten oder für Patches einreichen möchte.

Wie entferne ich das "Tracking" dieser Dateien aus meinem persönlichen Repo (behalte sie aber im Quellcode, damit ich sie verwenden kann), so dass ich die Änderungen nicht sehe, wenn ich einen Status mache (oder einen Patch erstelle)?

Gibt es einen korrekten/kanonischen Weg, diese Situation zu handhaben?

22 Stimmen

Eine sehr nützliche Frage, aber ich bin neugierig, warum Sie nicht die Änderungen an der .csproj Datei, die ein wichtiger Bestandteil eines jeden Projekts ist. Änderungen an der .csproj.user Datei oder eine .Publish.XML Ich kann durchaus verstehen, dass Sie keine Dateien verfolgen wollen, aber ich frage mich, warum Sie nicht auch die .csproj

9 Stimmen

Vielleicht verwenden sie eine andere IDE?

4 Stimmen

Ironischerweise bin ich auf diesen Thread gestoßen, weil ich .suo-Dateien aus einem Repo entfernen, aber lokal behalten möchte. Für die Nachwelt: Bei der .Net-Entwicklung ist es erforderlich, .csproj-Dateien im Repo zu behalten, und diese Änderungen sollten immer nachverfolgt werden, es sei denn, Sie möchten den Zorn anderer Entwickler an Ihrem Projekt spüren. Wenn Sie sich unsicher sind, werfen Sie einen Blick auf das Gitignore Files Repo auf GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore

2424voto

anthony Punkte 39130

Einfach anrufen git rm --cached für jede der Dateien, die Sie aus der Revisionskontrolle entfernen wollen, sollte ausreichen. Solange Ihre lokalen Ignoriermuster korrekt sind, werden Sie diese Dateien nicht in der Ausgabe von git status sehen.

Beachten Sie, dass bei dieser Lösung die Dateien aus dem Repository entfernt werden, so dass alle Entwickler ihre eigenen lokalen (nicht revisionskontrollierten) Kopien der Datei pflegen müssen

Um zu verhindern, dass git Änderungen in diesen Dateien erkennt, sollten Sie auch diesen Befehl verwenden:

git update-index --assume-unchanged [path]

Was Sie wahrscheinlich tun wollen: (von unten @Ryan Taylor Antwort )

  1. Damit teilen Sie git mit, dass Sie eine eigene, unabhängige Version der Datei oder des Ordners haben möchten. Sie wollen zum Beispiel keine Konfigurationsdateien aus der Produktion/dem Staging-Bereich.

git update-index --skip-worktree <path-name>

Die vollständige Antwort finden Sie hier unter dieser URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/

6 Stimmen

Laut Handbuch: git-rm - Remove files from the working tree and from the index Das ist genau das, was ich nicht tun möchte. Habe ich etwas übersehen? In der Dokumentation zu git rm finde ich jedoch die Option --cached --cached: Verwenden Sie diese Option, um Pfade nur aus dem Index zu lösen und zu entfernen. Die Dateien des Arbeitsbaums, ob geändert oder nicht, werden in Ruhe gelassen. Ich denke, das ist es, was ich brauche, richtig?

213 Stimmen

"git rm --cached <Datei>" würde <Datei> aus der Versionskontrolle entfernen, während sie im Arbeits-Repository verbleibt. Ob es das ist, was Sie wollen...

0 Stimmen

Yeah gute Entscheidung auf --cached. Ich bin so daran gewöhnt, dass die meisten Build-bezogenen Dateien generiert werden. Ich werde meine Antwort bearbeiten.

476voto

Ryan Taylor Punkte 10733

Es gibt 3 Optionen; wahrscheinlich wollen Sie #3

  1. Dadurch bleibt die lokale Datei für Sie erhalten, wird aber für alle anderen gelöscht, wenn sie sie abrufen.

    git rm --cached <file-name> o git rm -r --cached <folder-name>

  2. Dies dient der Optimierung, z.B. eines Ordners mit einer großen Anzahl von Dateien, z.B. SDKs, die sich wahrscheinlich nie ändern werden. Es weist Git an, diesen riesigen Ordner nicht mehr jedes Mal lokal auf Änderungen zu prüfen, da es dort keine geben wird. Die assume-unchanged Der Index wird zurückgesetzt und die Datei(en) werden überschrieben, wenn es Upstream-Änderungen an der Datei/dem Ordner gibt (wenn Sie ziehen).

    git update-index --assume-unchanged <path-name>
  3. Damit wollen Sie Git mitteilen, dass Sie Ihre eigene unabhängige Version der Datei oder des Ordners. Sie möchten zum Beispiel keine Konfigurationsdateien aus der Produktion/dem Staging überschreiben (oder löschen).

    git update-index --skip-worktree <path-name>

    Es ist wichtig zu wissen, dass git update-index wird sich nicht ausbreiten mit Git, so dass jeder Benutzer es unabhängig ausführen muss.

26 Stimmen

Diese Antwort ist die vollständigste - sie bietet verschiedene Lösungen mit den jeweiligen Auswirkungen. In dem speziellen Fall, mit dem ich arbeite, ist ein Kennwort in eine Konfigurationsdatei eingebettet. Ich möchte eine Vorlagendatei propagieren und dann das Kennwort zu meiner Kopie hinzufügen. Die Kopie mit dem Kennwort soll ignoriert und nicht überschrieben werden.

3 Stimmen

Wie kann ich in meinem lokalen System überprüfen, welche Dateien für "assume-unchanged" oder "skip-worktree" gelten?

4 Stimmen

@SupawatPusavanno um zu sehen, welche Dateien Sie zuvor für assume-unchanged oder skip-worktree ausgewählt haben, sehen Sie sich diese Antwort an stackoverflow.com/questions/42363881/ -- es verwendet grep y git ls-files

264voto

araqnid Punkte 116680

Wenn Sie das tun git update-index --assume-unchanged file.csproj Git prüft die Datei .csproj nicht automatisch auf Änderungen, so dass sie nicht mehr im Git-Status angezeigt werden, wenn Sie sie ändern. Sie können also alle Ihre .csproj-Dateien auf diese Weise markieren - allerdings müssen Sie alle neuen Dateien, die Sie vom Upstream-Repository erhalten, manuell markieren. (Wenn Sie sie in Ihrem .gitignore o .git/info/exclude dann werden die von Ihnen erstellten ignoriert)

Ich bin mir nicht ganz sicher, was .csproj-Dateien sind... wenn sie etwas in der Art von IDE-Konfigurationen (ähnlich wie Eclipse .eclipse und .classpath-Dateien) sind, dann würde ich vorschlagen, dass sie einfach nie Quellcode-kontrolliert sein sollten, überhaupt. Auf der anderen Seite, wenn sie Teil des Build-Systems sind (wie Makefiles) dann sollten sie eindeutig--- und eine Möglichkeit, optionale lokale Änderungen (z.B. aus einer local.csproj a la config.mk) zu übernehmen, wäre nützlich: Teilen Sie den Build in globale Teile und lokale Überschreibungen auf.

8 Stimmen

Csproj ist eine C#-Projektdatei, die festhält, welche Dateien in Ihrem Projekt enthalten sind und andere wenige Konfigurationen, sie MUSS quellkontrolliert sein, damit das Projekt funktioniert

5 Stimmen

Das ist die einzig richtige Antwort! Ich benutze @araqnids Antwort schon seit Jahren und sie funktioniert genau wie gewünscht, um dieses Problem zu lösen.

0 Stimmen

Welche Bedeutung hat das Präfix "file" im Argument des Befehls? Warum ist es nicht einfach .csproj ?

161voto

rjha94 Punkte 4112

Dies ist ein zweistufiger Prozess:

  1. Aufhebung der Verfolgung von Dateien/Ordnern - aber Beibehaltung auf der Festplatte - mit

    git rm --cached 

    Jetzt werden sie nicht mehr als "geändert" angezeigt, sondern immer noch als

        untracked files in  git status -u  
  2. Hinzufügen zu .gitignore

68 Stimmen

Nein, damit wird die Datei aus der Verfolgung entfernt und lokal gespeichert, sondern bewirken, dass sie für jeden, der sie abruft, gelöscht wird. .

1 Stimmen

In meinem Fall fügte ich versehentlich einen Ordner hinzu, der nicht verfolgt werden sollte, und deshalb brauchte ich diese Funktion.

4 Stimmen

Ja, es ist in der Tat die falsche Antwort auf die gestellte Frage - aber es ist wahrscheinlich die richtige Antwort für die meisten Leute, die diese Frage in den Suchergebnissen finden (wie ich).

116voto

Die akzeptierte Antwort hat bei mir immer noch nicht funktioniert

Ich habe

git rm -r --cached .

git add .

git commit -m "Fixierung von .gitignore"

Ich habe die Antwort von aquí

0 Stimmen

Dieser Link ist sehr nützlich, vor allem, um rekursiv alle Dateien in der .gitignore zu entfernen

12 Stimmen

Ich bin schon 3 Mal hierher zurückgekehrt und hoffe, dass ich mir das bis zum nächsten Mal einprägen kann!

1 Stimmen

@Edward Newell 's Kommentar wie in der obige Antwort gilt auch hier: "Damit wird die Datei aus der Verfolgung entfernt und lokal gespeichert, sondern bewirken, dass sie für jeden, der sie abruft, gelöscht wird. ".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X