Frage

Ich habe ein wenig mit CVS herumgespielt und bin nicht mit all seinen Funktionen vertraut, aber es ist für mich ein großes Ärgernis, wenn ich versuche, neue Verzeichnisse hinzuzufügen, die mehr Verzeichnisse enthalten.Läuft "cvs add„ fügt nur den Inhalt des aktuellen Verzeichnisses hinzu und verwendet „cvs import" sah auch nicht nach dem Richtigen aus, da es sich immer noch nur um Code handelt, den ich produziere (dieses Howto beansprucht den Import für). Quellen von Drittanbietern)

Kennt ihr eine Möglichkeit, alles in einem bestimmten Verzeichnis rekursiv zum aktuellen CVS-Projekt hinzuzufügen (oder ob SVN oder Git dies erheblich einfacher machen)?

War es hilfreich?

Lösung

Ah, Leerzeichen.Dies funktioniert mit Leerzeichen:

find . -type f -print0| xargs -0 cvs add

Andere Tipps

Ich fand, dass das ziemlich effektiv funktioniert hat:

Fügen Sie zunächst alle Verzeichnisse hinzu, jedoch keine mit dem Namen „CVS“:

find . -type d \! -name CVS -exec cvs add '{}' \;

Fügen Sie dann alle Dateien hinzu, mit Ausnahme aller Dateien in einem CVS-Verzeichnis:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Wenn jemand ein Heilmittel gegen die Peinlichkeit hat, CVS heutzutage zu verwenden ...

Ich benutze das:

Fügen Sie zunächst rekursiv alle Verzeichnisse außer den CVS-Verzeichnissen hinzu:

$> find . -type d \! -name CVS -exec cvs add '{}' \;

Zweitens fügen Sie alle Dateien hinzu, mit Ausnahme der CVS-Verzeichnisse:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Drittens „festschreiben“ rekursiv wie „erste Version“-Kommentar:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

Letztes Tagging aller rekursiven Elemente:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

Fügen Sie zunächst alle Verzeichnisse zu CVS hinzu

find . -type d -print0| xargs -0 cvs add

Fügen Sie dann alle Dateien in den Verzeichnissen zu CVS hinzu

find . -type f | grep -v CVS | xargs cvs add

Hat bei mir funktioniert

cvs import ist nicht nur für Quellen von Drittanbietern gedacht.Tatsächlich werden Verzeichnisse von CVS nicht versioniert und unterliegen daher nicht den Zweigstellenrichtlinien.Solange Sie leere Verzeichnisse importieren, ist das in Ordnung.

Beachten Sie, dass Sie nur verwenden können cvs add auf Dateien und Ordner, die sich in einer bereits ausgecheckten Arbeitskopie befinden, andernfalls erhalten Sie die „CVS/Einträge können nicht zum Lesen geöffnet werden“ Nachricht.Eine Technik zum Erstellen eines neuen „Root-Moduls“ mit cvs add wird in diesem WinCVS-FAQ-Artikel erklärt: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Wenn Sie Windows verwenden, unterstützen sowohl TortoiseCVS als auch WinCVS das rekursive Hinzufügen (und optionales Festschreiben) mehrerer Dateien in einem einzigen Vorgang.Suchen Sie in WinCvs nach dem Makro Add>Recursive Add (auto-commit)...Verwenden Sie in Tortoise den Befehl „Inhalt hinzufügen“ für ein Verzeichnis.In beiden Fällen können Sie auswählen, welche Dateien hinzugefügt werden sollen und welche Schlüsselwort-Erweiterungsmodi für sie verwendet werden sollen (wird hauptsächlich zum Definieren der Binärdateien verwendet).

Weitere Informationen zum rekursiven Hinzufügen in WinCvs finden Sie hier: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


Abgesehen davon cvs import eignet sich gut für Massenzugaben.Allerdings der Weg cvs import in Vanilla CVS implementiert ist, hat zwei Nachteile (weil es War ursprünglich für Code von Drittanbietern geschrieben):

  • es erstellt einen obligatorischen Zweig mit spezieller Semantik.
  • Es werden keine Repository-Metadaten erstellt (d. h.die versteckten CVS-Verzeichnisse) benötigt, um den importierten Code als ausgecheckte Arbeitskopie zu etablieren, was bedeutet, dass Sie die importierten Dateien zunächst aus dem Repository auschecken müssen, um tatsächlich mit ihnen arbeiten zu können

Wenn Sie CVSNT verwenden, können Sie beide Nachteile vermeiden, indem Sie Folgendes angeben -nC Option beim Import. -n dient dazu, den Zweig „Verkäufer“ zu vermeiden und -C dient zum Erstellen der CVS-Verzeichnisse.

Diese Antwort von Mark war nützlich (finden Sie .-Type f -print0 | XARGS -0 CVS addieren), aber ich habe ein Problem gelöst, das auftrat, wenn der Lebenslauf hinzufügen versucht, seine eigenen Dateien wie Tag, Einträge, ect ..

  1. Fügen Sie Ihren obersten Ordner mit dem Namen NEW_FOLDER hinzu
cvs add NEW_FOLDER
  1. Verwenden Sie den vorherigen Befehl mit einigen Ausnahmen, um den gesamten Unterordnerbaum hinzuzufügen

finde NEW_FOLDER/ -type d !-name „CVS“ -und !-name "Tag" -und !-name "Entries.Log" -und !-name „Einträge“ -und !-name „Repository“ -und !-name "root" -print0 | xargs -0 cvs hinzufügen

  1. Verwenden Sie den vorherigen Befehl mit einigen Ausnahmen, um alle Dateien hinzuzufügen

finde NEW_FOLDER/ -type f !-name „CVS“ -und !-name "Tag" -und !-name "Entries.Log" -und !-name „Einträge“ -und !-name „Repository“ -und !-name "root" -print0 | xargs -0 cvs hinzufügen

Ich glaube, das habe ich in meinen CVS-Tagen getan:

find . -type f | xargs cvs add

Fügen Sie zunächst alle Verzeichnisse zu CVS hinzu

find . -type d -print0| xargs -0 cvs add

Fügen Sie dann alle Dateien in den Verzeichnissen zu CVS hinzu

find . -type f -print0| xargs -0 cvs add

Ich verwende dieses einfache Shell-Skript, das aus einem bereits ausgecheckten CVS-Verzeichnis gestartet werden sollte.Es wird dummerweise versuchen, alle Dateien und Verzeichnisse, die es bei seiner rekursiven Suche findet, hinzuzufügen/festzuschreiben, sodass Sie am Ende einen vollständig festgeschriebenen Baum erhalten sollten.

Speichern Sie dies einfach als etwas wie /usr/bin/cvsadd und vergiss es nicht chmod +x /usr/bin/cvsadd.

#!/bin/sh
# @(#) add files and directories recursively to the current CVS directory
# (c) 2009 by Dirk Jagdmann 

if [ -z "$1" ] ; then
    echo "usage: cvsadd 'import message'"
    exit 1
fi

if [ -d "$2" ] ; then
    cvs add "$2"
    cd "$2" || exit 1
fi

if [ ! -d CVS ] ; then
    echo "current directory needs to contain a CVS/ directory"
    exit 1
fi

XARGS="xargs -0 -r -t -L 1"

# first add all files in current directory
find . -maxdepth 1 -type f -print0 | $XARGS cvs add
find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# then add all directories
find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"

Bereits besprochene Methoden werden rekursiv suchen, aber es fällt fehl, wenn Sie die gleiche Aktion erneut ausführen (wenn Sie Substree zu existiertem Baum hinzufügen möchten), aus diesem Grund müssen Sie überprüfen, ob Ihre Verzeichnisse noch nicht hinzugefügt wurden, und dann nur Dateien hinzuzufügen, die nicht noch hinzugefügt.Dazu verwenden wir die Ausgabe von cvs up Um zu sehen, welche Elemente noch nicht hinzugefügt wurden, wird am Zeilenanfang ein Fragezeichen angezeigt.

Wir nutzen Optionen -0, -print0 Und -zZ um sicherzustellen, dass wir Leerzeichen in Dateinamen korrekt verarbeiten.Wir verwenden auch --no-run-if-empty Um dies zu vermeiden, führen Sie es aus, wenn nichts hinzugefügt werden muss.

CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep '^\?.*' | sed -e 's/^? //' > $CVS_PATTERN
find . -type d \! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . \( -type d  -name CVS -prune \) -o \( -type f  -print0 \) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m 'commiting tree recursively'

Mit diesem Ansatz vermeiden wir solche Fehler:

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

Und

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1

Ich mache das gerne (da Verzeichnisse eine Ergänzung benötigen)

cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

Möglicherweise müssen Sie dies mehrmals ausführen (zuerst für die Verzeichnisse, dann für die untergeordneten Verzeichnisse), bis keine Ausgabe erfolgt

Marks Lösung Behebt das Leerzeichenproblem, erzeugt jedoch dieses Problem:

cvs hinzufügen:CVS/Einträge nicht zum Lesen nicht öffnen:Keine solche Datei oder Verzeichnis
CVS [ADD ABTETED]:kein Repository

Um das Problem zu beheben, lautet der eigentliche Befehl:

find . -type f -exec cvs add {} \;

SVN macht diese Aufgabe auf jeden Fall trivial, die Verwendung einer GUI wie Tortoise ist jedoch noch einfacher.

Dies könnte ein guter Anfang sein: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top