SVN: Ignorieren Sie einige Verzeichnisse rekursiv

105

Ich möchte nicht, dass ein Verzeichnis mit dem Namen buildoder distin mein SVN aufgenommen wird, egal wie tief es im Baum ist.

Ist das möglich? In git habe ich gerade gesetzt

build
dist

in meinem .gitignorean der Wurzel und es ignoriert rekursiv. Wie mache ich das mit svn? Bitte sag mir nicht, dass ich für jedes Elternverzeichnis ein Requisit machen soll ...

Paul Tarjan
quelle
Überprüfen Sie diese Antwort auf eine native Lösung, wenn Sie Subversion 1.8 verwenden.
Frank Kusters

Antworten:

56

Ab Subversion 1.8 gibt es jetzt die svn:global-ignoresEigenschaft, die wie, svn:ignoreaber rekursiv funktioniert (setzen Sie diese also in Ihrem Verzeichnis der obersten Ebene).

Zwilling
quelle
3
Ich bin ein bisschen verwirrt - es gibt global-ignoresin der ~/.subversion/configDatei, aber auch die vererbbare svn:global-ignores Eigenschaft, die für ein Verzeichnis in einem SVN-Repo festgelegt ist, sowie svn:ignore- können Sie eine Zusammenfassung dieser verschiedenen Optionen und deren Vergleich bereitstellen? Wie wirkt sich die --recursiveFlagge auch auf sie aus?
Dai
2
Ich habe meine eigenen Nachforschungen angestellt und meine Ergebnisse in dieser QS-Antwort veröffentlicht: stackoverflow.com/a/86052/159145
Dai
[Ich habe es versucht, aber es ist fehlgeschlagen, der objOrdner wurde immer noch angezeigt ] ( stackoverflow.com/questions/50960188/… ), können Sie mir helfen, einen Blick darauf zu werfen?
Luke
Kann ich "build / *" sagen und alles unter Build in jedem Build-Ordner ignorieren?
Johannes Schaub - litb
45

svn propsetnimmt --recursiveals Option, so können Sie dies mit zwei Nachteilen tun:

  1. Sie müssen das gesamte Repository (oder zumindest alle darin enthaltenen Verzeichnisse) auschecken und
  2. Sie müssen daran denken, die svn:ignoreEigenschaft festzulegen, wenn Sie ein neues Verzeichnis hinzufügen
Michael Hackner
quelle
41

Dies ist nicht möglich. Es gibt nur zwei Ignoriermechanismen in Subversion svn:ignore(die nicht rekursiv sind) und global-ignores(die nicht spezifisch für ein Repository sind).

Kevin Reid
quelle
7
svn propset --recursive svn: ignoriere svn_ignore_rules. Dabei ist svn_ignore_rules eine Datei, die die Ignorierregeln enthält - eine pro Zeile
Georgia
3
'svn propset --recursive svn: ignoriere --file svn_ignore_rules.' für mich mit svn-1.7.6 ignorieren Sie sonst rekursiv Dateien mit dem Namen 'svn_ignore_rules' [bearbeiten: gemäß 'wytten' in einem Kommentar unten]
elbeardmorez
9
An die Kommentatoren: Wie der Fragesteller sagte: "Bitte sag mir nicht, dass ich für jedes Elternverzeichnis ein Requisit machen soll ...".
Kevin Reid
5
Es ist jetzt möglich in Subversion 1.8
Eichhörnchen
17

Das funktioniert bei mir:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
quelle
2
Vielen Dank dafür, funktioniert großartig ... Übrigens konnte ich sowohl * .txt als auch * .pdf nur ignorieren, indem ich diese Muster in eine Datei legte und dann die Option 'svn propset --file'
wytten
13

Fügen Sie Ihrer Datei ~ / .subversion / config oder / etc / subversion / config Folgendes hinzu:

[miscellany]
global-ignores = build dist
jspcal
quelle
Ich würde es lieber per Repo machen, wenn ich kann
Paul Tarjan
1
hmm nicht sicher, ob es eine einfache Möglichkeit gibt, dies pro Repo zu tun, ein Pre-Commit-Hook könnte bestimmte Muster ablehnen, aber es ist keine vollständige Lösung. svn: Ignorieren auf jedem übergeordneten Verzeichnis funktioniert, aber nicht rekursiv. Sie könnten Ihre Konfigurationsdatei mit einem Skript austauschen, wenn Sie an verschiedenen Repos arbeiten, aber das ist ein zusätzlicher Schritt.
Jspcal
1
Was bedeutet build dist ?
IgorGanapolsky
9

Es ist möglich, Build- und Dist-Verzeichnisse zu ignorieren, indem die Verzeichnisse aus der Versionskontrolle entfernt werden. Der Trick besteht darin, die Option --keep-local zu verwenden, um das Verzeichnis in der Arbeitskopie zu belassen. Beispielsweise:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Das Verzeichnis wird nicht mehr durch Subversion verfolgt, befindet sich jedoch weiterhin in Ihrer Arbeitskopie, um die Compilerausgabe usw. zu speichern.

Prost, Joe

jsharit
quelle
7

Zum Beispiel die Ordnerstruktur:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Es ist gut, dist-Inhalte vor dem Befehl ignore zu löschen, damit dist für Zweige leer ist.

Arbeitete für mich, heute getestet. Hier ist die Seite, die es ein bisschen erklärt

marian
quelle
6

Um alle diese Dateien in allen Repositorys zu ignorieren, können Sie global-ignoresIhrer Benutzerkonfigurationsdatei eine hinzufügen .

Auf Unix-ähnlichen Systemen wird dieser Bereich als Verzeichnis mit dem Namen .subversion im Home-Verzeichnis des Benutzers angezeigt. Auf Win32-Systemen erstellt Subversion einen Ordner mit dem Namen Subversion, normalerweise im Bereich Anwendungsdaten des Profilverzeichnisses des Benutzers

Siehe Konfigurationsoptionen

Leider gibt es dafür keine Option pro Repository. Es ist im Grunde genommen pro Benutzer oder pro Verzeichnis, also ist das Vielfache svn:ignoreswahrscheinlich der richtige Weg, so ärgerlich es auch sein mag.

Blair Conrad
quelle
1
Ich würde es lieber per Repo machen, wenn ich kann
Paul Tarjan
Oh, dann hast du kein Glück. Wie @ Kevin Reid sagt - Sie haben pro Verzeichnis oder pro Benutzer.
Blair Conrad
6

Sie müssen zuerst in den obersten Ordner Ihrer Arbeitskopie wechseln und dort eine Datei erstellen (z. B. .svnignore), in der Sie alle Muster platzieren sollten, die Sie ignorieren möchten, z. B. (für ein Android-Projekt):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Anschließend führen Sie den folgenden Befehl aus (denken Sie daran, dass Sie sich im obersten Ordner Ihrer Arbeitskopie befinden müssen):

svn propset svn:ignore -R -F .svnignore .

Dies funktioniert nur für Ordner und Dateien, die noch nicht der Versionskontrolle unterliegen. Wenn Sie möchten, dass ein Ordner (oder eine Datei), der / der versioniert wird, ebenfalls ignoriert wird, entfernen Sie ihn aus der Versionskontrolle, indem Sie den folgenden Befehl ausführen:

svn rm --keep-local <path>

Ich habe all dies aus diesem großartigen Artikel erhalten, der alles erklärt: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Luccas Correa
quelle
Das war sehr hilfreich. Dies ist der beste Weg, den ich gefunden habe, um in svn ein git-ähnliches Ignorierverhalten zu erzielen. Vielen Dank.
Jonathan Wilson
6

Ab Subversion 1.8 ist es möglich, Global-Ignores für das aktuelle Repository festzulegen.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Sie können auch einen Ordner mit dem Namen .svnignore erstellen und Bedingungen schreiben.

build
dist

Denken Sie daran, dass eine Bedingung pro Zeile vergeben ist. Die Einstellung von build / * oder dist / debug ist vergebens. Dann machen Sie den Befehl:

svn propset svn:global-ignores -F .svnignore .
John Zhu
quelle
funktioniert einwandfrei! Führen Sie einfach den ersten Befehl für das neu ausgecheckte Repo aus.
Gaurav
3

Erstellen Sie eine Datei und fügen Sie Ihre Ignorierungen hinzu

Ingore-Liste:

file1 
directory1
file2
etc...

Wenden Sie dann den folgenden Befehl an

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

Verzeichnis ist der Name Ihres Verzeichnisses, Sie können auch Verzeichnis / Unterverzeichnis unterkategorisieren. Oder verwenden Sie *, um das aktuelle Verzeichnis zu notieren, in dem Sie sich befinden.

Dies setzt voraus, dass Sie bash als Shell verwenden

jncc99
quelle
Was ist das $ n hier?
Igor Ganapolsky
1
@igor Ganapolsky - Das $ n ist die Variable der for-Schleife. Es wird als Index für die Sequenz festgelegt, in die Sie eine Schleife einfügen. in diesem Fall das Verzeichnis, wie im obigen Beispiel durch "Verzeichnis" angegeben.
jncc99
3
svn propset --recursive svn:ignore svn_ignore_rules .

Dabei ist svn_ignore_rules eine Datei, die die Ignorierregeln enthält - eine pro Zeile

Natürlich müssen Sie es jedes Mal neu ausführen, wenn Sie Ihrem Repo ein neues Verzeichnis hinzufügen

svn_ignore_rules kann auch als in das Repo eingecheckt betrachtet werden, um von anderen Benutzern, die Schreibzugriff auf das Repo haben, wiederverwendbar zu sein

georg
quelle
2
cd parent_dir #das Verzeichnis mit dem Ordner, der rekursiv ignoriert werden soll
svn propedit svn: ignorieren. # wird svn-prop.tmp öffnen
Ordner eintragen
^ X.
Y.
Commit -m 'Zielrichtlinie ignorieren'
Moin Haidar
quelle
hat mir geholfen, ich hatte ein Problem mit dem Einstellen des Ordnermusters, SVN hat diesen Ordner nicht im Repo ausgeführt, set EDITOR=notepadhat svn propedit svn:ignore .gut funktioniert ...
Betlista
1

Da es für dieses wahrscheinlich häufige Problem keine Lösung zu geben scheint, möchte ich unsere Lösung teilen. Wie die anderen bereits klargestellt haben, können Sie entweder die svn:ignoreEigenschaft verwenden, dies gilt für ein einzelnes Verzeichnis (und daher nicht für neue), oder Sie verwenden, global-ignoresdie für einen einzelnen Benutzer gilt (aber nicht zum Repository gehört).

Um das Leben ein bisschen einfacher zu machen, habe ich eine Registrierungsdatei mit dem Namen erstellt Settings.Svn.regund sie dem Stammverzeichnis des Repositorys hinzugefügt. Jetzt kann jeder einmal auf diese Reg-Datei doppelklicken und hat die Einstellungen vorgenommen.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Ich würde mich sehr über eine Lösung im SVN-Repository freuen. Wenn also jemand weiß, möchten Sie diese gerne teilen?

martinstoeckli
quelle
0

Eine Möglichkeit wäre, dem Pre- oder Post-Commit-Hook eine Art Check hinzuzufügen, aber es ist einfach, wenn Sie den Repo-Server nicht besitzen.

8DH
quelle