So nutzen Sie die SVN-CLI effektiv

7

Wie kann ich mich mit der SVN-CLI produktiver machen? Ich muss sich wiederholende Aufgaben wie diese erledigen:

  • Suchen Sie nach geänderten Dateien im Verzeichnis
  • begehen Sie nur EINIGE von ihnen
    • Wählen Sie sie irgendwie anders aus, als sich an ihre Namen zu erinnern
  • Liste nicht versionierter Dateien
    • füge nur einige hinzu, indem du eine andere effektive Methode verwendest, als dich daran zu erinnern
  • Setzen Sie nur einige Dateien in einem bestimmten Verzeichnis zurück

Ich war an TortoiseSVN unter Windows gewöhnt, aber ein Wechsel zu OSX (das ziemlich Linux-ähnlich ist) zwang mich, die CLI von SVN zu verwenden, da andere Clients schlecht oder sehr teuer sind.

Tomáš Fejfar
quelle
Ich habe eine benutzerdefinierte Shell-Funktion, die ich von zu Hause aus veröffentlichen werde und die genau zeigt, wie diese Vorgänge effizient ausgeführt werden können. Ich hatte die gleichen seltsamen Aktionen, die ich oft machte, und schien ungeschickt zu sein.
Caleb
Würdet ihr bitte hinzufügen, was ihr für Diffs benutzt? Ich habe PHP-Code und der Standardunterschied ist nicht hervorgehoben und macht jeden Überblick über die Codeänderungen zu einem Kampf :(
Tomáš Fejfar

Antworten:

4

Ich stoße auf ähnliche Probleme. Mein Ansatz war es, Shell-Aliase oder -Funktionen für die häufigsten Aktionen zu schreiben, die ich ausführe. Als Referenz sind dies ZSH-Shell-Funktionen. Die Funktionen selbst sollten auch in Bash funktionieren, aber die Shell-Vervollständigung wäre anders.

Bei der Überprüfung Ihrer Nutzung unterscheidet sich die Aktion "Einige auswählen", die Sie ausführen möchten, von meiner Nutzung, und es gibt keine Vorkehrungen dafür. Ich würde Ihnen tatsächlich vorschlagen, Ihre Verwendung der Revisionskontrolle zu ändern, um häufigere Commits durchzuführen und mehrere Arbeitskopien oder Zweige in einem Repository zu nutzen, um selektive Änderungssätze zu verfolgen. Wenn Sie in einem Verzeichnis arbeiten, sollte alles, was Sie dort tun, entweder festgeschrieben oder selektiv zurückgesetzt werden, aber es sollte nicht viel übrig bleiben. Legen Sie fest, was Sie zu einem bestimmten Zeitpunkt haben, und verwenden Sie die Funktionen zur Revisionskontrolle, um zu handhaben, was in das Produkt einfließt oder nicht.

Damit dies funktioniert, würden Sie den Code in Ihre ~/.zshrcDatei einfügen (oder ~/.bashrcfür Bash).

Hier ist die Hauptfunktion, die ich (jeden Tag) benutze:

function svnlist () {
    if [ -z "$2" ]; then
        case $1 in
            clobered)
                svn status | grep '^~' | cut -c9-
                ;;
            missing)
                svn status | grep '^\!' | cut -c0-
                ;;
            unknown)
                svn status | grep '^\?' | cut -c9-
                ;;
            conflicted)
                svn status | grep '^C' | cut -c9-
                ;;
        esac
    else
        case $2 in
            add)
                $0 unknown | xargs -iX svn add "X"
                ;;
            del)
                $0 missing | xargs -iX svn del "X"
                ;;
            revert) $0 conflicted | xargs -iX svn revert "X"
                ;;
            resolved) $0 conflicted | xargs -iX svn resolved "X"
                ;;
            unclober)
                mkdir _tmp
                $0 clobered | while read item; do
                    mv "$item" _tmp
                    svn del "$item"
                done
                svn ci -m "Unclobering files. (removing old)"
                mv _tmp/* .
                rmdir _tmp
                $0 unknown add
                svn ci -m "Unclobering files. (adding new)"
                ;;
        esac
    fi
}

alias svndiff="svn diff -x -b | colordiff"
compctl -x 'p[1]' -k '(missing unknown conflicted clobered)' - 'p[2]' -k '(add del revert resolved)' -- svnlist

Auf diese Weise sollten Sie so etwas wie ausführen können svnlist unknown, um alle Dateien im aktuellen Verzeichnis zu finden, die nicht versioniert sind, und svnlist unknown addum optional alle hinzuzufügen. svnlist clobered revertwürde alle Dateien finden, die nach einem Update gelöscht wurden, und sie zurücksetzen. svnlist conflicted resolvedwürde alle Konflikte als gelöst markieren. svnlist missing delwürde alle in Aktion fehlenden Dateien als im Repository gelöscht markieren.

Auch wenn Sie darauf stoßen, finden Sie hier eine zum Bearbeiten der Protokollnachricht einer bestimmten Revision. Ich benutze das nicht mehr so ​​oft, aber ich habe schon früh viele Fehler gemacht und ziehe es vor, die Protokollnachrichten aufgeräumt zu halten:

function svneditlog () {
    rev=$1
    if ! echo $rev | pcregrep '^[0-9]+$'; then
        echo "Invalid usage. svneditlog REV"
        return
    fi
    svn info | grep ^URL: | awk '{print $2}' | read url
    svn propedit -r $rev --revprop svn:log $url
}

Wenn ich mir diesen Code anschaue, zeigt sich wirklich, dass ich diese vor vielen Jahren geschrieben habe, als ich gerade mit der Versionskontrolle angefangen habe und in einer Shell nicht sehr elegant war, aber es sollte trotzdem funktionieren.

Caleb
quelle
1
Vielen Dank. Meine Nutzung wird teilweise von dem Projekt bestimmt, an dem ich arbeite. Ich muss einige Variablen ändern, damit es lokal funktioniert und diese Variablen nicht in die Produktion gelangen. Das Projekt hat eine ziemlich lange Geschichte und ich kann das in den alten Versionen, die noch verwendet werden, nicht beheben. Es wurde größtenteils behoben, aber einige Änderungen sind noch erforderlich. Aber Ihre Skripte haben mir die Denkweise gezeigt, die ich haben sollte ... thx
Tomáš Fejfar
4

Nutzen Sie die Fertigstellung Ihrer Shell . Bash hat einige Fertigstellung für svn, zsh's ist deutlich besser. svn add <TAB>Vervollständigt in zsh beispielsweise nur Dateien, die noch nicht registriert sind, svn commit <TAB>listet nur Dateien auf, die registriert sind und Änderungen aufweisen, und so weiter. Dies allein sollte Ihnen das meiste geben, was Sie fragen:

  • Suchen Sie nach geänderten Dateien im Verzeichnis → svn statusodersvn commit <TAB>
  • begehen Sie nur EINIGE von ihnen → svn commit <TAB>
  • Liste nicht versionierter Dateien → svn statusodersvn add <TAB>
  • füge nur einige hinzu → svn add <TAB>
  • nur einige Dateien in einem bestimmten Verzeichnis zurücksetzen → svn revert <TAB>

Definieren Sie Aliase und Funktionen für die Befehle, die Sie am häufigsten verwenden. Hier sind einige, die ich in zsh verwende (beachten Sie, dass ich zu VC-agnostischen Aliasen übergehe; dies sind SVN-spezifische Verknüpfungen, analog zu den CVS-Verknüpfungen, die ich seit etwa einem Jahrzehnt verwende).

## Show file status (excluding non-controlled files)
alias svns='svn status > >(grep -v "^?")'
## Show the status of modified files (in particular, to notice potential conflicts in the next update)
svnm () {
  [[ $# -ne 0 ]] || set .
  svn merge -r BASE:HEAD --dry-run "$@" | sed -e '/^-/d'
  return $pipestatus[1]
}

## log (in chronological order)
svnl () {
  local since="1" cmd arg= ret=0
  if [[ $1 = <1900->-<1-12>-<1-31> ]]; then
    since="{$1}"
    shift
  elif [[ $1 = <1-> ]]; then
    since=$1
    shift
  fi
  cmd=(svn log -r$since:HEAD)
  while [[ $1 = -* ]]; do
    cmd=($cmd $1)
    shift
  done
  if [[ $# -ne 0 ]]; then
    for arg; do
      $cmd[@] $1
      ret=$((ret > $? ? $ret : $?))
    done
    return $ret
  else
    $cmd[@]
  fi
}
## log (from the start of the present branch or the last move)
alias svnlb='svnl --stop-on-copy'

Möglicherweise möchten Sie einige Versionskontrollinformationen mit zsh's in Ihre Eingabeaufforderung aufnehmen vcsinfo.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Vielen Dank. Wirklich gute Nutzung von Dry Run Merge. Ich mag das :) Ich bin mir nicht sicher, ob ich zu zsh wechseln werde (das Wechseln von win-> unix ist schon genug problematisch), aber es ist trotzdem eine interessante Verwendung.
Tomáš Fejfar