SVN CLI를 효과적으로 사용하는 방법

SVN CLI를 효과적으로 사용하는 방법

SVN CLI를 사용하여 작업 효율성을 높이는 방법은 무엇입니까? 다음과 같은 반복적인 작업을 완료해야 합니다.

  • 디렉토리에서 수정된 파일 찾기
  • 그 중 일부만 제출
    • 어떤 방식으로든 선택한 다음 이름을 기억하세요.
  • 버전이 지정되지 않은 파일 나열
    • 작동하는 것을 사용하여 몇 가지를 추가한 다음 기억하세요.
  • 특정 디렉터리의 일부 파일만 복구

저는 Windows에서 TortoiseSVN에 익숙하지만 OSX(Linux와 매우 유사)로 전환하면 다른 클라이언트가 형편없거나 매우 비싸기 때문에 SVN의 CLI를 사용해야 합니다.

답변1

비슷한 문제가 발생했습니다. 내 접근 방식은 내가 수행하는 가장 일반적인 작업에 대한 셸 별칭이나 함수를 작성하는 것입니다. 참고로 ZSH 쉘 함수입니다. 기능 자체는 bash에서도 작동해야 하지만 쉘이 수행하는 작업은 다릅니다.

사용법을 살펴보면 수행하려는 "일부 선택" 작업이 나와 다르며 어떤 방식으로도 규정되지 않습니다. 실제로 커밋을 더 자주 수행하고 저장소의 여러 작업 복사본이나 분기를 활용하여 선택적 변경 세트를 추적하도록 개정 제어 사용을 수정하는 것이 좋습니다. 디렉터리에서 작업하는 경우 디렉터리에서 수행하는 모든 작업은 선택적으로 커밋되거나 되돌려져야 하지만 너무 많이 남겨두어서는 안 됩니다. 언제든지 가지고 있는 것을 커밋하고 버전 제어 기능을 사용하여 제품에 포함되거나 포함되지 않은 항목에 대해 작업하십시오.

작동하게 하려면 코드를 ~/.zshrc파일(또는 ~/.bashrcbash)에 넣을 수 있습니다.

내가 매일 사용하는 주요 기능은 다음과 같습니다.

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

svnlist unknown이렇게 하면 현재 디렉터리에서 버전이 지정되지 않은 모든 파일을 찾고 svnlist unknown add선택적으로 모두 추가하기 위해 이와 같은 작업을 실행할 수 있습니다 . svnlist clobered revert업데이트 후 손상된 모든 파일을 찾아서 복원합니다. svnlist conflicted resolved모든 충돌은 해결된 것으로 표시됩니다. svnlist missing del작업 중에 손실된 모든 파일은 저장소에서 삭제된 것으로 표시됩니다.

또한 이러한 상황이 발생하는 경우 특정 개정판에 대한 로그 메시지를 편집하는 방법은 다음과 같습니다. 더 이상 사용하지 않지만 초기에 많은 실수를 저질렀으며 로그 메시지를 깔끔하게 유지하는 것을 선호합니다.

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
}

이 코드를 보면 제가 이 코드를 몇 년 전에 막 버전 제어를 사용하기 시작했을 때 작성했다는 것을 알 수 있으며, 셸에서는 그다지 우아하지는 않지만 여전히 작동할 것입니다.

답변2

쉘을 활용하세요마치다. Bash에는 몇 가지 완성 기능이 있지만 svnzsh는 훨씬 더 좋습니다. 예를 들어 zsh에서는 svn add <TAB>아직 등록되지 않은 파일만 완료되고, svn commit <TAB>등록되어 변경된 파일만 나열되는 식입니다. 이것만으로도 대부분의 요구 사항을 충족할 수 있습니다.

  • 디렉토리에서 수정된 파일 찾기 → svn status또는svn commit <TAB>
  • 일부만 제출 →svn commit <TAB>
  • 버전이 없는 파일 나열 → svn status또는svn add <TAB>
  • 좀 추가해 보세요 →svn add <TAB>
  • 특정 디렉터리의 일부 파일만 복구 →svn revert <TAB>

가장 많이 사용하는 명령에 대한 별칭과 기능을 정의하세요. 다음은 zsh에서 사용하는 몇 가지입니다(VC에 구애받지 않는 별칭으로 이동하고 있습니다. 이는 10년 정도 사용해 온 CVS 단축키와 유사한 svn 관련 단축키입니다).

## 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'

프롬프트에 zsh와 같은 일부 버전 제어 정보를 포함할 수 있습니다.vcsinfo.

관련 정보