Wie ignoriere ich Dateien in Subversion?

644

Wie ignoriere ich Dateien in Subversion?

Wie finde ich auch Dateien, die nicht der Versionskontrolle unterliegen?

andyuk
quelle
Es macht Spaß zu sehen, wie jede einfache Frage (wahrscheinlich von einem Git-Benutzer) viele überkomplizierte Antworten bedeutet. Wenn dies passiert, ist das Subversion Baby.
Valerio Bozz

Antworten:

738

(Diese Antwort wurde aktualisiert, um dem Verhalten von SVN 1.8 und 1.9 zu entsprechen.)

Sie haben 2 Fragen:

Dateien als ignoriert markieren:

Mit "ignorierte Datei" meine ich, dass die Datei auch in "nicht versioniert" nicht in Listen angezeigt wird: Ihr SVN-Client gibt vor, dass die Datei im Dateisystem überhaupt nicht vorhanden ist.

Ignorierte Dateien werden durch ein "Dateimuster" angegeben. Die Syntax und das Format von Dateimustern werden in der Online-Dokumentation von SVN erläutert: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Dateimuster in Subversion".

Subversion ab Version 1.8 (Juni 2013) und höher unterstützt drei verschiedene Arten der Angabe von Dateimustern. Hier ist eine Zusammenfassung mit Beispielen:

1 - Laufzeitkonfigurationsbereich - global-ignoresOption:

  • Dies ist eine clientseitige Einstellung, sodass Ihre global-ignoresListe nicht von anderen Benutzern freigegeben wird. Sie gilt für alle Repos, die Sie auf Ihrem Computer auschecken.
  • Diese Einstellung ist in Ihrer Runtime Configuration Area-Datei definiert:
    • Windows (dateibasiert) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (registrierungsbasiert) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoressowohl in HKLMals auch HKCU.
    • Linux / Unix - ~/.subversion/config

2 - Die svn:ignoreEigenschaft, die für Verzeichnisse (nicht für Dateien) festgelegt ist:

  • Dies wird im Repo gespeichert, sodass andere Benutzer dieselben Ignorierdateien haben. Ähnlich wie es .gitignorefunktioniert.
  • svn:ignorewird auf Verzeichnisse angewendet und ist nicht rekursiv oder vererbt. Alle Dateien oder unmittelbaren Unterverzeichnisse des übergeordneten Verzeichnisses, die dem Dateimuster entsprechen, werden ausgeschlossen.
  • Während SVN 1.8 das Konzept der "geerbten Eigenschaften" hinzufügt, wird die svn:ignoreEigenschaft selbst in nicht unmittelbaren Nachkommenverzeichnissen ignoriert:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Die Datei ./subdirectory/ignoreThiswird also nicht ignoriert, obwohl " ignoreThis.txt" auf das .Repo-Stammverzeichnis angewendet wird ).

  • Um eine Ignorierliste rekursiv anzuwenden, müssen Sie sie daher verwenden svn propset svn:ignore <filePattern> . --recursive.

    • Dadurch wird in jedem Unterverzeichnis eine Kopie der Eigenschaft erstellt.
    • Wenn sich der <filePattern>Wert in einem untergeordneten Verzeichnis unterscheidet, überschreibt der Wert des untergeordneten Elements die übergeordneten Elemente vollständig, sodass kein "additiver" Effekt auftritt.
    • Wenn Sie also das <filePattern>im Stammverzeichnis .ändern, müssen Sie es mit ändern, --recursiveum es im untergeordneten Verzeichnis und im untergeordneten Verzeichnis zu überschreiben.
  • Ich stelle fest, dass die Befehlszeilensyntax nicht intuitiv ist.

    • Ich ging zunächst davon aus, dass Sie eine Datei in SVN ignorieren würden, indem Sie so etwas eingeben, svn ignore pathToFileToIgnore.txtaber so funktioniert die Ignorierfunktion von SVN nicht.

3- Die svn:global-ignoresEigenschaft. Benötigt SVN 1.8 (Juni 2013):

  • Dies ist ähnlich svn:ignore, außer dass die Funktion "geerbte Eigenschaften" von SVN 1.8 verwendet wird.
  • Im Vergleich dazu svn:ignorewird das Dateimuster automatisch in jedem untergeordneten Verzeichnis angewendet (nicht nur in unmittelbaren untergeordneten Verzeichnissen).
    • Dies bedeutet, dass das Setzen svn:global-ignoresmit dem --recursiveFlag nicht erforderlich ist, da geerbte Ignorierdateimuster automatisch angewendet werden, wenn sie geerbt werden.
  • Ausführen des gleichen Befehlssatzes wie im vorherigen Beispiel, jedoch svn:global-ignoresstattdessen:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Für TortoiseSVN-Benutzer:

Diese ganze Anordnung war für mich verwirrend, da die Terminologie von TortoiseSVN (wie sie in ihrem Windows Explorer-Menüsystem verwendet wird) mich anfangs irreführte - ich war mir nicht sicher, welche Bedeutung die "Rekursiv hinzufügen", "Hinzufügen *" und "Hinzufügen" des Menüs "Ignorieren" hatten. Optionen. Ich hoffe, dieser Beitrag erklärt, wie die Funktion "Ignorieren" mit der Funktion "SVN-Eigenschaften" verknüpft ist. Trotzdem schlage ich vor, die Befehlszeile zu verwenden, um ignorierte Dateien festzulegen, damit Sie ein Gefühl dafür bekommen, wie es funktioniert, anstatt die GUI zu verwenden, und die GUI nur zum Bearbeiten von Eigenschaften zu verwenden, nachdem Sie mit der Befehlszeile vertraut sind.

Auflisten von Dateien, die ignoriert werden:

Der Befehl svn statusblendet ignorierte Dateien aus (d. H. Dateien, die einem RGA- global-ignoresMuster oder dem svn:ignoreMuster eines unmittelbaren übergeordneten Verzeichnisses oder dem Muster eines Ancesor-Verzeichnisses entsprechen svn:global-ignores.

Verwenden Sie die --no-ignoreOption, um die aufgelisteten Dateien anzuzeigen. Ignorierte Dateien haben den Status von Iund leiten die Ausgabe an weiter, grepum nur Zeilen anzuzeigen, die mit "I" beginnen.

Der Befehl lautet:

svn status --no-ignore | grep "^I"

Zum Beispiel:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!

andyuk
quelle
6
So finden Sie ignorierte Dateien: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
Wenn Sie die Datei ./FolderA/FolderB/FileToIgnore ignorieren möchten, tun Sie dies von Ihrem. Ordner: svn propset svn: ignoriere "FileToIgnore" FolderA / FolderB /
jnj
8
Wenn Sie ssh'ing ausführen svn propedit svn:ignore .und kein Texteditor konfiguriert ist, wird die Fehlermeldung svn angezeigt: E205007: Keine der Umgebungsvariablen SVN_EDITOR, VISUAL oder EDITOR ist festgelegt, und es wurde keine Laufzeitkonfigurationsoption 'editor-cmd' verwendet gefunden, anstatt einen Editor zu öffnen. Geben Sie einfach --editor-cmd nano wie folgt ansvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
Sie können auch Dateien mit einem bestimmten Dateinamen in allen Unterordnern mit dem Argument "--recursive" ignorieren. dh svn propset svn: ignoriere "* .jpg".
Templer
2
Eine einfachere Alternative zu awk ist grep:svn status | grep '^?'
Johnride
90

Verwenden Sie den folgenden Befehl, um eine Liste zu erstellen, die sich nicht unter Versionskontrolldateien befindet.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Bearbeiten Sie dann die Datei so, dass nur die Dateien übrig bleiben, die Sie tatsächlich ignorieren möchten . Verwenden Sie diese Option, um die in der Datei aufgeführten Dateien zu ignorieren:

svn propset svn:ignore -F ignoring.txt .

Beachten Sie den Punkt am Ende der Zeile. Es teilt SVN mit, dass die Eigenschaft im aktuellen Verzeichnis festgelegt wird.

Löschen Sie die Datei:

rm ignoring.txt

Schließlich verpflichten,

svn ci --message "ignoring some files"

Sie können dann überprüfen, welche Dateien ignoriert werden über:

svn proplist -v
ulitosCoder
quelle
2
Nett. Eine kleine Verbesserung ist svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
4
Warum die Datei löschen?
Behalte
Beachten Sie, dass diese Lösung Dateien in Unterverzeichnissen nicht ignoriert (auch wenn sie in ignoring.txt angezeigt werden).
Shaneb
Würde das bestehende Ignoranzen beibehalten? Wenn nicht, wie geht das in einem Befehl (dh --no-ignoriert und behält auch Zeilen vor I bei)?
a1an
Dies würde Ihre aktuellen Ignorierungen überschreiben. Versuchen Sie: svn pg svn:ignore . >> ignore.txtNach dem ersten Befehl zum Anhängen der aktuellen Ignorierungen an die Datei.
ulitosCoder
53

.gitignore wie Ansatz

Sie können eine Datei oder ein Verzeichnis wie .gitignore ignorieren. Erstellen Sie einfach eine Textdatei mit einer Liste der Verzeichnisse / Dateien, die Sie ignorieren möchten, und führen Sie den folgenden Code aus:

svn propset svn:ignore -F ignorelist.txt .

ODER wenn Sie keine Textdatei verwenden möchten, können Sie dies folgendermaßen tun:

svn propset svn:ignore "first
 second
 third" .

Quelle: Karstens Blog - Svn festlegen: Für mehrere Dateien über die Befehlszeile ignorieren

Adrian Enriquez
quelle
1
Beachten Sie, dass Sie den svn:ignoreBefehl erneut ausführen müssen, wenn Sie Ihre Ignorierdatei später ändern (siehe stackoverflow.com/a/58380306/189518 )
Sensei James
50

Wenn Sie TortoiseSVN verwenden , klicken Sie mit der rechten Maustaste auf eine Datei und wählen Sie dann TortoiseSVN / Hinzufügen, um die Liste zu ignorieren . Dadurch wird die Datei / der Platzhalter zur svn:ignoreEigenschaft hinzugefügt .

svn:ignorewird beim Einchecken von Dateien überprüft und übereinstimmende Dateien werden ignoriert. Ich habe die folgende Ignorierliste für ein Visual Studio .NET-Projekt:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Sie finden diese Liste im Kontextmenü unter TortoiseSVN / Properties .

artur02
quelle
26

Da scheint es niemand erwähnt zu haben ...

svn propedit svn:ignore .

Bearbeiten Sie dann den Inhalt der Datei, um die zu ignorierenden Muster anzugeben, beenden Sie den Editor und Sie sind fertig.

Yorick
quelle
3
Diese Antwort war nützlich. In meinem Fall musste ich "." in das Unterverzeichnis der Datei wollte ich ignorieren und nur das Dateimuster angeben. Außerdem musste ich das erste Mal Folgendes ausführen (ich bin auf einem Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

Ich habe den Artikel .svnignore Beispiel für Java gefunden .

Beispiel: .svnignore für Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

Und danach:

svn propset svn:ignore -F .svnignore .

Beispiele für .gitignore. Sie können für Ihren .svnignore verwenden

https://github.com/github/gitignore

d.danailov
quelle
1
Ich habe getan, wie du gesagt hast ... aber wenn ich den SVN-Status ausgeführt habe. Es werden weiterhin die ignorierten Dateien mit "?"
Harshit Gupta
Ich habe nie mit dem SVN-Status überprüft, aber mit SVN Add * und nach diesem SVN-Commit wird das Ignorieren von Dateien nicht festgeschrieben.
d.danailov
Wenn sich eine Datei "a.txt" bereits in der Versionskontrolle befindet, erfolgt das Ignorieren über den Befehl "svn propset svn: ignore -F .svnignore a.txt"? ist es richtig ?
errakeshpd
Wenn Sie "a.txt" in Ihre .svnignore-Datei einfügen, bin ich mir nicht sicher, aber der Befehl sollte korrekt sein.
d.danailov
10

Stellen Sie bei der Verwendung von propedit sicher, dass keine nachgestellten Leerzeichen vorhanden sind, da dies dazu führt, dass die Datei von der Ignorierliste ausgeschlossen wird.

Diese werden automatisch eingefügt, wenn Sie unter Linux Tab-Autocomplete verwenden, um die Datei zunächst zu erstellen:

svn propset svn:ignore 'file1
file2' .
Kenneth
quelle
6
Dies funktioniert nur bei einigen Shells, z. B. Bash. Beachten Sie, dass die Neuausgabe des Befehls propset den vorherigen Satz von Mustern überschreibt.
JA Faucett
Also müssen Datei1 und Datei2 in getrennten Zeilen stehen?
Igor Ganapolsky
8

Eine andere Lösung ist:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

oder Zeile für Zeile

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Was es macht:

  1. Ruft die Statusdateien vom SVN ab
  2. Speichert alle Dateien mit ? in die Datei "svnignore.txt"
  3. Ruft die bereits ignorierten Dateien ab und hängt sie an die Datei "svnignore.txt" an.
  4. Weist den SVN an, die Dateien in "svnignore.txt" zu ignorieren.
  5. Entfernt die Datei
bkbilly
quelle
8

Wenn Sie Tortoise SVN verwenden, können Sie Folgendes tun:

  1. Wählen Sie im Kontextmenü "TortoiseSVN" und dann "Eigenschaften".
  2. Klicken Sie im angezeigten Fenster auf "Neu" und dann auf "Erweitert".
  3. Wählen Sie im angezeigten Fenster neben "Eigenschaftsname" "svn: ignore" aus oder geben Sie den gewünschten Dateinamen oder Ordnernamen oder die Dateimaske ein (in meinem Fall "* / target"). Klicken Sie auf "Übernehmen" Eigenschaft rekursiv "
  4. OK. OK.
  5. Verpflichten
msangel
quelle
6
  1. cd ~ / .subversion
  2. Konfiguration öffnen
  3. finde die Zeile wie 'global-ignoriert'
  4. Setzen Sie den Dateityp "Ignorieren" wie folgt: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store node_modules Ausgabe
范 陆 离
quelle
Vielen Dank, Ihre Antwort ist die einzige, die die configDatei erwähnt.
Henrique de Sousa
In dieser Antwort wird es auch unter @HenriquedeSousa stackoverflow.com/a/86052/7724 erwähnt und es wird auch erklärt, dass es sich um eine lokale Methode handelt, bei der Dateien nur vom Client ignoriert werden.
Bzlm
5

Eine besser lesbare Version von bkbillys Antwort:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Was es macht:

  1. Ruft die Statusdateien vom SVN ab
  2. Speichert alle Dateien mit ? in die Datei "svnignore.txt"
  3. Ruft die bereits ignorierten Dateien ab und hängt sie an die Datei "svnignore.txt" an.
  4. Weist den SVN an, die Dateien in "svnignore.txt" zu ignorieren.
  5. Entfernt die Datei
LivingDust
quelle
Ich mag die Antwort von bkbilly, aber diese Version unterbricht jede Zeile, um sie besser lesbar zu machen, und entfernt das &&, das in meinen Tests nichts bewirkt hat, da in der ersten Zeile immer die temporäre Datei erstellt wird und dieselbe temporäre Datei immer in die Ignorierliste aufgenommen wird.
LivingDust
Ein Bearbeitungsvorschlag wäre in diesem Fall angemessener. Schätzen Sie den Aufwand!
Jim
Ich hatte noch nicht genug Ruf, um eine Bearbeitung vorzuschlagen. aber ich möchte kein gutes Protokoll ruinieren. Gibt es eine einfache README-Datei mit Richtlinien, wann es besser ist, Vorschläge zu machen und zu bearbeiten, als eine neue Antwort usw. zu veröffentlichen?
LivingDust
1
Wenn Ihre Antwort genau die gleiche ist wie die vor anderthalb Jahren, ist sie ziemlich einfach. Sie haben sogar die Erklärung " Was es tut " kopiert .
Jim
3

Sie können auch ein globales Ignoriermuster in der SVN-Konfigurationsdatei festlegen.

petr k.
quelle
1
Können Sie ein Ignoriermuster für ein bestimmtes Repository festlegen?
David Doria
3

svn status Hier erfahren Sie, welche Dateien nicht in SVN enthalten sind und was geändert wurde.

Sehen Sie sich die SVN-Eigenschaften für die Ignorier-Eigenschaft an.

Für alle SVN-Dinge muss das Rote Buch gelesen werden.

DGM
quelle
2

Verwenden Sie den Befehl svn status auf Ihrer Arbeitskopie, um den Status von Dateien anzuzeigen. Dateien, die noch nicht der Versionskontrolle unterliegen (und nicht ignoriert werden), werden mit einem Fragezeichen versehen.

Informationen zum Ignorieren von Dateien zum Bearbeiten der Eigenschaft svn: ignore finden Sie im Kapitel Ignorieren nicht versionierter Elemente im svnbook unter http://svnbook.red-bean.com/de/1.5/svn.advanced.props.special.ignore. html . Das Buch beschreibt auch mehr über die Verwendung des SVN-Status.

Andreas Holstenson
quelle
2

SVN ignoreist in TortoiseSVN einfach zu verwalten. Öffnen Sie TortoiseSVN, klicken Sie mit der rechten Maustaste auf das Dateimenü und wählen Sie Hinzufügen, um die Liste zu ignorieren.

Dadurch werden die Dateien in der svn:ignoreEigenschaft hinzugefügt . Wenn wir die Dateien einchecken, werden die Dateien, die damit übereinstimmen svn:ignore, ignoriert und nicht festgeschrieben.

Im Visual Studio-Projekt haben wir folgende Dateien hinzugefügt, die ignoriert werden sollen:

bin obj
*.exe
*.dll
*.pdb
*.suo

Wir verwalten den Quellcode auf SVN von Comparetrap mit dieser Methode erfolgreich

Locker
quelle
2

Was hat bei mir funktioniert:

Wie ignoriere ich Dateien in Subversion?
1.Klicken Sie im Datei-Explorer mit der rechten
Maustaste auf den Ordnernamen des SVN-Projekts. 2.Klicken Sie auf "SVN - Festschreibung ...".
3.Ein Fenster "
Festschreiben " wird angezeigt. 4.Klicken Sie mit der rechten Maustaste auf den Ordner / die Datei, die Sie ignorieren möchten
5.Klicken Sie auf Hinzufügen, um die Liste zu ignorieren.
6.Wählen Sie den Ordner / die Datei.
7. Übernehmen Sie die "Eigenschaftsänderung" in SVN

Wie finde ich auch Dateien, die nicht der Versionskontrolle unterliegen?
Klicken Sie nach Schritt 3 oben auf "Nicht versionierte Dateien anzeigen".

jump_monkey
quelle
0
  1. Öffnen Sie verwenden JetBrains Produkt (dh Pycharm)
  2. dann auf die Shortcut - Taste auf der oberen Symbolleiste oder Verwendung ‚commit‘ ‚ctrl + k‘ screenshot_toolbar
  3. Verschieben Sie Ihre unerwünschten Dateien auf der Festschreibungsoberfläche wie folgt in eine andere Änderungsliste. screenhot_commit_change
  4. Beim nächsten Mal können Sie nur die Standardänderungsliste festschreiben.
G. Googol
quelle