Rsync außer .svn-Ordnern und deren Unterinhalten?

10

Umgang mit einem Subversion-Repo und einem neuen Benutzer, der nicht ganz verstanden hat, wie es funktioniert.

Kurz gesagt, da ihre lokale Struktur durch das Kopieren zufälliger .svn-Ordner durcheinander gebracht wurde, habe ich Folgendes getan:

  • kopierte die lokale Struktur in einen Ordner namens Staging
  • Alle .svn-Ordner wurden rekursiv aus dem Staging-Verzeichnis gelöscht
  • checkte das Repo in einen "sauberen Ordner"

Jetzt sind wir beim letzten Schritt angelangt: Der Inhalt des Staging-Ordners wird überschrieben, um den sauberen Inhalt zu überschreiben.

Ich brauche einen Befehl, der den Inhalt des Staging-Verzeichnisses in das Bereinigungsverzeichnis kopiert und alles entfernt, was sich nur im Bereinigungsverzeichnis befindet, ABER die .svn-Ordner des Bereinigungsordners bleiben erhalten.

Das klingt nach einem Job für rsync. Wäre der folgende Befehl korrekt?

rsync -avr --exclude=.svn* [staging] [clean]
SeanKilleen
quelle
6
Sie können immer rsyncmit der --dry-runOption laufen , um herauszufinden!
Tim
Hahaha Danke! Hatte keine Ahnung, dass diese Option existiert. Hätte den Mann genauer lesen sollen!
SeanKilleen

Antworten:

31

Die -COption für rsync kann das sein, was Sie wollen.

Lassen Sie sich jedoch nicht von der kurzen Beschreibung auf der Manpage täuschen. Es scheint, dass die Option nur für CVS gilt, aber abhängig von Ihrer rsync-Version werden die Dateien fast aller gängigen Versionskontrollsysteme übersprungen.

# rsync version: 3.0.7

-C, --cvs-exclude           auto-ignore files in the same way CVS does

...

          The exclude list is initialized to exclude the  following  items
          (these  initial  items are marked as perishable — see the FILTER
          RULES section):

                 RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS
                 .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
                 *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe
                 *.Z *.elc *.ln core .svn/ .git/ .bzr/

          then,  files  listed in a $HOME/.cvsignore are added to the list
          and any files listed in the CVSIGNORE environment variable  (all
          cvsignore names are delimited by whitespace).
Zoredache
quelle
2
Seien Sie sehr vorsichtig, da diese Erweiterungen möglicherweise für Dateien verwendet werden, die Sie kopieren möchten, z. *.aist für iOS Static Libraries.
Max Chuquimia
NB Dateien und Verzeichnisse sind ausgeschlossen: Ordner mit dem Namen "core" werden nicht kopiert, z. B. / myproj / api / / myproj / core / <- nicht gesichert!
Teknopaul
7

Fast - das sollte sein

rsync -av --exclude='.svn*' [staging] [clean]

oder jede andere Form des Zitierens, die verhindert, dass die Shell den Platzhalter erweitert. (Der Platzhalter würde nur mit einer unwahrscheinlichen Datei übereinstimmen, deren Name mit beginnt. Es --exclude=.svnist jedoch besser, das Risiko nicht einzugehen und auch dann ordnungsgemäß zu funktionieren, wenn die Shell so konfiguriert ist, dass nicht übereinstimmende Platzhalter erstickt oder auf die leere Liste erweitert werden. )

-rist bereits enthalten in -a. Das Extra rist einfach überflüssig, es schadet nicht.

--excludebewirkt, dass Dateien, die mit seinem Argument übereinstimmen, weder kopiert noch für eine rekursive Durchquerung berücksichtigt werden. Die übliche Schwierigkeit bei rsync besteht darin, in die andere Richtung zu gehen und ein Verzeichnis mit Ausnahme bestimmter Teile davon auszuschließen. Einige Tipps finden Sie unter Rsync-Filter: Kopieren nur eines Musters .

In diesem speziellen Fall ist das Ausschließen von Versionskontrollverzeichnissen eine schnelle Möglichkeit, das zu erhalten, was Sie möchten.

Gilles 'SO - hör auf böse zu sein'
quelle