Cách sử dụng SVN CLI hiệu quả


7

Làm cách nào tôi có thể làm cho bản thân hiệu quả hơn với SVN CLI? Tôi cần phải hoàn thành các nhiệm vụ lặp đi lặp lại như sau:

  • tìm tập tin sửa đổi trong thư mục
  • chỉ cam kết MỘT SỐ trong số họ
    • chọn chúng bằng cách nào đó khác sau đó nhớ tên của họ
  • liệt kê các tập tin không đảo ngược
    • chỉ thêm một số bằng cách sử dụng một số cách hoàn hảo khác sau đó ghi nhớ chúng
  • chỉ hoàn nguyên một số tệp trong thư mục nhất định

Tôi đã quen với TortoiseSVN trên Windows, nhưng việc chuyển sang OSX (khá giống linux) đã buộc tôi sử dụng CLI của SVN, vì các máy khách khác rất tệ hoặc thực sự tốn kém.


Tôi có một chức năng shell tùy chỉnh mà tôi sẽ gửi từ nhà cho thấy chính xác cách thức các hoạt động đó có thể được thực hiện một cách hiệu quả. Tôi đã có những hành động kỳ quặc giống như tôi đang làm rất nhiều và có vẻ vụng về.
Caleb

Các bạn vui lòng thêm những gì bạn sử dụng cho diffs? Tôi có mã PHP và khác biệt mặc định không được làm sáng tỏ và làm cho mọi tổng quan về mã thay đổi trở thành một cuộc đấu tranh :(
Tomáš Fejfar

Câu trả lời:


4

Tôi gặp vấn đề tương tự. Cách tiếp cận của tôi là viết các bí danh hoặc hàm cho các hành động phổ biến nhất mà tôi thực hiện. Để tham khảo, đây là các hàm shell ZSH. Bản thân các chức năng cũng hoạt động trong bash, nhưng công cụ hoàn thành shell sẽ khác.

Khi xem xét cách sử dụng của bạn, hành động "chọn một số" bạn muốn thực hiện khác với cách sử dụng của tôi và không có quy định nào cho việc đó. Tôi thực sự sẽ đề nghị sửa đổi việc sử dụng kiểm soát sửa đổi của bạn để thực hiện các cam kết thường xuyên hơn và tận dụng nhiều bản sao hoặc chi nhánh hoạt động trong kho lưu trữ để theo dõi các bộ thay đổi có chọn lọc. Nếu bạn đang làm việc trong một thư mục, mọi thứ bạn làm ở đó sẽ được cam kết hoặc được hoàn nguyên trên cơ sở chọn lọc, nhưng không nên để lại nhiều xung quanh. Cam kết những gì bạn đã có tại bất kỳ thời điểm nào và sử dụng các tính năng kiểm soát sửa đổi để xử lý những gì đi vào sản phẩm hay không.

Để làm việc này, bạn sẽ đặt mã vào ~/.zshrctệp của mình (hoặc ~/.bashrccho bash).

Đây là chức năng chính tôi sử dụng (mỗi ngày):

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

Điều này sẽ cho phép bạn chạy một cái gì đó như svnlist unknownđể tìm tất cả các tệp trong thư mục hiện tại không được đảo ngược và svnlist unknown addtùy ý thêm tất cả chúng. svnlist clobered revertsẽ tìm thấy tất cả các tệp đã bị ghi lại sau khi cập nhật và hoàn nguyên chúng. svnlist conflicted resolvedsẽ đánh dấu tất cả các xung đột là giải quyết. svnlist missing delsẽ đánh dấu bất kỳ tập tin bị thiếu trong hành động là bị xóa trong kho lưu trữ.

Ngoài ra nếu bạn gặp phải nó, đây là một để chỉnh sửa thông điệp tường trình của một phiên bản cụ thể. Tôi không sử dụng nó nhiều nữa nhưng tôi đã mắc rất nhiều lỗi từ sớm và thích giữ các thông điệp tường trình gọn gàng:

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
}

Khi xem mã này, nó thực sự cho thấy rằng tôi đã viết những thứ này từ nhiều năm trước khi tôi mới bắt đầu với kiểm soát phiên bản và không duyên dáng trong một cái vỏ, nhưng nó vẫn hoạt động.


1
Cảm ơn rât nhiều. Việc sử dụng của tôi một phần được xác định bởi dự án tôi đang làm việc. Tôi cần thay đổi một số biến để làm cho nó hoạt động cục bộ và các biến đó không nên được đưa vào sản xuất. Dự án có một lịch sử khá dài và tôi không thể sửa nó trong các phiên bản cũ, vẫn đang được sử dụng. Nó hầu như đã được sửa, nhưng một số thay đổi vẫn cần thiết. Nhưng các kịch bản của bạn đã cho tôi thấy khung suy nghĩ mà tôi nên có ... thx
Tomáš Fejfar

4

Tận dụng sự hoàn thành của vỏ của bạn . Bash đã hoàn thành một số svn, zsh's tốt hơn đáng kể. Ví dụ: trong zsh, svn add <TAB>chỉ hoàn thành các tệp chưa được đăng ký, svn commit <TAB>chỉ liệt kê các tệp đã được đăng ký và có thay đổi, v.v. Điều này một mình sẽ cung cấp cho bạn hầu hết những gì bạn đang hỏi:

  • tìm tập tin sửa đổi trong thư mục → svn statushoặcsvn commit <TAB>
  • chỉ cam kết MỘT SỐ trong số họ → svn commit <TAB>
  • liệt kê các tệp không đảo ngược → svn statushoặcsvn add <TAB>
  • chỉ thêm một số → svn add <TAB>
  • chỉ hoàn nguyên một số tệp trong thư mục nhất định → svn revert <TAB>

Xác định các bí danh và hàm cho các lệnh bạn sử dụng thường xuyên nhất. Đây là một số mà tôi sử dụng trong zsh (lưu ý rằng tôi đang chuyển sang các bí danh không biết về VC; đây là các phím tắt dành riêng cho svn, tương tự như các phím tắt CVS mà tôi đã sử dụng trong một thập kỷ hoặc lâu hơn).

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

Bạn có thể muốn bao gồm một số thông tin kiểm soát phiên bản trong lời nhắc của mình, với zsh's vcsinfo.


1
Cảm ơn. Sử dụng thực sự tốt của hợp nhất chạy khô. Tôi thích điều đó :) Không chắc chắn tôi sẽ chuyển sang zsh (chuyển win-> unix đã đủ vấn đề rồi), nhưng vẫn là cách sử dụng thú vị.
Tomáš Fejfar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.