Wie ignoriere ich Dateien in Subversion?
Wie finde ich auch Dateien, die nicht der Versionskontrolle unterliegen?
(Diese Antwort wurde aktualisiert, um dem Verhalten von SVN 1.8 und 1.9 zu entsprechen.)
Du hast 2 Fragen:
Mit "ignorierte Datei" meine ich, dass die Datei nicht als "unversioned" 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 wird in der Online-Dokumentation von SVN erläutert: http://svnbook.red-bean.com/nightly/de/svn.advanced.props.special.ignore.html "Dateimuster in Subversion ".
Subversion ab Version 1.8 (Juni 2013) und höher unterstützt drei verschiedene Arten, Dateimuster anzugeben. Hier eine Zusammenfassung mit Beispielen:
global-ignores
:global-ignores
-Liste nicht von anderen Benutzern freigegeben wird. Sie gilt für alle Repos, die Sie auf Ihrem Computer ausgecheckt haben.C:\Users\{you}\AppData\Roaming\Subversion\config
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
in HKLM
und HKCU
.~/.Subversion/config
svn:ignore
-Eigenschaft, die für Verzeichnisse (nicht für Dateien) festgelegt ist:.gitignore
.svn:ignore
wird auf Verzeichnisse angewendet und ist nicht rekursiv oder vererbt. Alle Dateien oder unmittelbar -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:ignore
-Eigenschaft selbst in nicht unmittelbar nachkommenden Verzeichnissen 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/ignoreThis
wird also nicht ignoriert, obwohl "ignoreThis.txt
" auf den .
Repo-Stamm angewendet wird).
Um eine Ignorierliste rekursiv anzuwenden, müssen Sie svn propset svn:ignore <filePattern> . --recursive
verwenden.
<filePattern>
-Wert in einem untergeordneten Verzeichnis unterschiedlich ist, überschreibt der untergeordnete Wert die übergeordneten Elemente vollständig, so dass es keinen "additiven" Effekt gibt.<filePattern>
im Stammverzeichnis .
ändern, müssen Sie ihn mit --recursive
ändern, um ihn in den untergeordneten und untergeordneten Verzeichnissen zu überschreiben.Ich stelle fest, dass die Befehlszeilensyntax gegenintuitiv ist.
svn ignore pathToFileToIgnore.txt
eingeben. Dies funktioniert jedoch nicht so, wie die Ignor-Funktion von SVN funktioniert.svn:global-ignores
-Eigenschaft. Benötigt SVN 1.8 (Juni 2013):svn:ignore
, außer dass die Funktion "geerbte Eigenschaften" von SVN 1.8 verwendet wird.svn:ignore
wird das Dateimuster automatisch in jedes untergeordnete Verzeichnis angewendet (nicht nur für untergeordnete Objekte) .svn:global-ignores
mit dem Flag --recursive
festzulegen, da vererbte Muster für Ignorierungsdateien automatisch übernommen werden, wenn sie vererbt werden.Führen Sie denselben Befehlssatz wie im vorherigen Beispiel aus, verwenden Sie stattdessen jedoch svn:global-ignores
:
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!
Diese ganze Anordnung war für mich verwirrend, da TortoiseSVNs Terminologie (wie sie in ihrem Windows Explorer-Menüsystem verwendet wird) anfangs für mich irreführend war - ich war nicht sicher, welche Bedeutung die Menüs "Rekursiv hinzufügen", "Hinzufügen *" und "Hinzufügen" des Ignore-Menüs haben. Optionen. Ich hoffe, in diesem Beitrag wird erläutert, wie die Funktion Ignorieren in die Funktion SVN-Eigenschaften eingebunden wird. Das heißt, ich empfehle die Verwendung der Befehlszeile, um ignorierte Dateien festzulegen, so dass Sie ein Gefühl für die Funktionsweise erhalten, anstatt die GUI zu verwenden, und nur die GUI zum Bearbeiten von Eigenschaften verwenden, nachdem Sie mit der Befehlszeile vertraut sind.
Mit dem Befehl svn status
werden ignorierte Dateien ausgeblendet (dh Dateien, die einem RGA global-ignores
-Muster entsprechen oder einem unmittelbaren svn:ignore
-Muster des übergeordneten Verzeichnisses oder einem beliebigen svn:global-ignores
-Muster eines Ancesor-Verzeichnisses entsprechen.
Verwenden Sie die Option --no-ignore
, um diese Dateien anzuzeigen. Ignorierte Dateien haben den Status I
, dann die Ausgabe an grep
weiterleiten, um 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!
Verwenden Sie den folgenden Befehl, um eine Liste zu erstellen, die nicht unter Versionskontrolldateien liegt.
svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt
Bearbeiten Sie dann die Datei in lassen Sie nur die Dateien, die Sie eigentlich ignorieren möchten. Verwenden Sie dann diese, um die in der Datei aufgelisteten Dateien zu ignorieren:
svn propset svn:ignore -F ignoring.txt .
Beachten Sie den Punkt am Ende der Zeile. Sie teilt SVN mit, dass die Eigenschaft für das aktuelle Verzeichnis festgelegt wird.
Löschen Sie die Datei:
rm ignoring.txt
Schließlich begehen,
svn ci --message "ignoring some files"
Sie können dann prüfen, welche Dateien ignoriert werden:
svn proplist -v
Wenn Sie TortoiseSVN verwenden, klicken Sie mit der rechten Maustaste auf eine Datei und wählen Sie TortoiseSVN/Zu Ignorierliste hinzufügen. Dadurch wird die Datei/Wildcard zur svn:ignore
-Eigenschaft hinzugefügt.
svn:ignore
wird beim Einchecken von Dateien geprü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.
Sie können eine Datei oder ein Verzeichnis wie .gitignore ignorieren. Erstellen Sie einfach eine Textdatei mit einer Liste von Verzeichnissen/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: Karsten's Blog - Set svn: ignoriere für mehrere Dateien von der Kommandozeile aus
Ich habe den Artikel .svnignore Example 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
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, und beenden Sie den Editor.
Wenn Sie propedit verwenden, stellen Sie 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 mit tab-autocomplete unter Linux die Datei erstellen, um mit zu beginnen:
svn propset svn:ignore 'file1
file2' .
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 zeilenweise
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:
Wenn Sie Tortoise SVN verwenden, können Sie Folgendes tun:
Eine besser lesbare Version der Antwort von bkbilly:
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:
SVN ignore
ist in TortoiseSVN einfach zu verwalten. Öffnen Sie TortoiseSVN und klicken Sie mit der rechten Maustaste auf das Dateimenü. Wählen Sie dann Hinzufügen, um die Liste zu ignorieren.
Dadurch werden die Dateien in die svn:ignore
-Eigenschaft eingefügt. Wenn wir die Dateien einchecken, wird die Datei, die mit svn:ignore
übereinstimmt, ignoriert und nicht festgeschrieben.
In Visual Studio-Projekt haben wir die folgenden Dateien zum Ignorieren hinzugefügt:
bin obj
*.exe
*.dll
*.pdb
*.suo
Wir verwalten den Quellcode auf SVN von Comparetrap mit dieser Methode erfolgreich
svn status
sagt Ihnen, welche Dateien sich nicht im SVN befinden und was geändert wurde.
Schauen Sie sich die SVN-Eigenschaften für die Ignoriereigenschaft an.
Für alles, was SVN ist, muss das Red Book gelesen werden.
Sie können auch ein globales Ignoriermuster in der Konfigurationsdatei von SVN festlegen.
Hinzufügen eines Verzeichnisses zu Subversion und Ignorieren des Verzeichnisinhalts
svn propset svn:ignore '\*.*' .
oder
svn propset svn:ignore '*' .
Verwenden Sie den Befehl svn status in Ihrer Arbeitskopie, um den Status von Dateien anzuzeigen. Dateien, die noch nicht unter Versionskontrolle stehen (und nicht ignoriert werden), werden mit einem Fragezeichen versehen.
Um Dateien zu ignorieren, müssen Sie die svn: ignore -Eigenschaft bearbeiten. Lesen Sie dazu das Kapitel Unversioned Items ignorieren 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.