2012-02-10 18 views
9

Thỉnh thoảng, tôi tạo ra các chi nhánh địa phương trong git, và tôi muốn nhận được một thông báo cảnh báo khi tôi cố gắng từ chối chúng.Làm thế nào tôi có thể tránh một sự cố tình cờ từ một chi nhánh địa phương

Làm cách nào để ngăn không cho tôi vô tình bị lôi kéo khỏi chi nhánh địa phương?

+0

Không built-in nhưng một ý tưởng: Ngay sau khi bạn chi nhánh, làm một 'git config --rename-phần "svn-remote.svn "" no-svn-remote "'. Khi bạn muốn thực hiện dcommit, bạn có thể hoàn nguyên. – vasquez

+0

Hoặc có lẽ tôi có thể chỉ định bằng cách nào đó rằng không có chi nhánh thượng nguồn cho chi nhánh địa phương này? Bạn có biết làm thế nào tôi có thể làm điều đó? – greg0ire

+0

Tôi nghiên cứu rằng trong ánh sáng của câu hỏi của bạn, nhưng có vẻ như git svn không nhận được chuyển đổi chi nhánh địa phương, do đó, nó nghĩ rằng nó vẫn còn trên thân cây hoặc thanh toán chi nhánh/thẻ. Có thể đáng để thử thay đổi dòng nhánh mặc định trong tệp cấu hình để kiểm tra điều này. – vasquez

Trả lời

8

Một giải pháp thay thế cho móc trước khi cam kết, nếu bạn đang sử dụng Linux (hoặc Git bash hoặc Cygwin hoặc tương tự), là để bọc git trong một hàm trợ giúp trình bao. Thêm bên dưới để ~/.bashrc của bạn (ví bash, Git bash) hoặc ~/.zshrc (đối với zsh) tập tin, hoặc bất cứ điều gì tương đương là cho vỏ của bạn:

real_git=$(which git) 
function git { 
    if [[ ($1 == svn) && ($2 == dcommit) ]] 
    then 
     curr_branch=$($real_git branch | sed -n 's/\* //p') 
     if [[ ($curr_branch != master) && ($curr_branch != '(no branch)') ]] 
     then 
      echo "Committing from $curr_branch; are you sure? [y/N]" 
      read resp 
      if [[ ($resp != y) && ($resp != Y) ]] 
      then 
       return 2 
      fi 
     fi 
    fi 
    $real_git "[email protected]" 
} 

(Tôi đã thử nghiệm điều này với bash và zsh trên Red Hat , và bash trên Cygwin)

Bất cứ khi nào bạn gọi git, bây giờ bạn sẽ gọi hàm này thay vì nhị phân thông thường. Chức năng sẽ chạy git bình thường, trừ khi bạn đang gọi git svn dcommit trong khi được gắn với một chi nhánh không phải là chủ. Trong trường hợp đó, nó sẽ nhắc bạn xác nhận trước khi thực hiện cam kết. Bạn có thể ghi đè hàm bằng cách chỉ định đường dẫn đến git một cách rõ ràng (đó là những gì mà $real_git đang thực hiện). Hãy nhớ rằng sau khi cập nhật ~/.bashrc hoặc tương đương, bạn sẽ cần phải tải lại nó, hoặc bằng cách bắt đầu phiên trình bao mới (đăng xuất và đăng nhập lại) hoặc bằng cách chạy source ~/.bashrc.

Sửa: Là một nâng cao, bạn có thể loại bỏ các dòng đầu tiên, bắt đầu real_git=, và thay thế các trường hợp khác của $real_git với command git, mà đạt được điều tương tự nhưng theo cách ưa thích. Tôi đã không cập nhật các kịch bản chính nó như tôi đã không thể kiểm tra sự thay đổi trên zsh.

+0

Ngẫu nhiên, nếu bạn muốn kiểm tra cách thức hoạt động này, 'git svn dcommit --dry-run' sẽ kích hoạt hành vi kiểm tra giống như' git svn dcommit', mà không thực sự cố thực hiện cam kết đó. –

+0

Tôi đang sử dụng linux + zsh, giải pháp của bạn không quá khó cho tôi để thích ứng, tôi cố gắng khi có thể. – greg0ire

+0

Tôi vừa thử nghiệm ở trên trong zsh; Việc này ổn với tôi. Chỉ cần đặt mã vào '~/.zshrc'. –

2

Điều đầu tiên bạn cần lưu ý là sử dụng móc nối trước git để giải quyết vấn đề. Đây sẽ là dễ dàng cho các hợp đồng mua tinh khiết git:

Nhưng như đã thảo luận trong Hooks for git-svn, điều này không hoàn toàn hoạt động. VonC đã đưa ra một (chấp nhận) answer nơi ông sử dụng một repo trần trung gian hoạt động như một loại proxy giữa git ans SVN.

Có thể điều này cũng có thể giúp bạn.

+0

Liên kết thứ hai có vẻ đầy hứa hẹn.+1 – greg0ire

0

Trong trường hợp bất cứ ai khác cần này cho Windows Powershell:

function CallGit 
    { 
     if (($args[0] -eq "svn") -And ($args[1] -eq "dcommit")) { 
      $curr_branch = &{git branch}; 
      $curr_branch = [regex]::Match($curr_branch, '\* (\w*)').captures.groups[1].value 
      if ($curr_branch -ne "master") { 
       Write-Warning "Committing from branch $curr_branch"; 
       $choice = "" 
       while ($choice -notmatch "[y|n]"){ 
        $choice = read-host "Do you want to continue? (Y/N)" 
       } 
       if ($choice -ne "y"){ 
        return 
       } 
      } 
     } 
     &"git.exe" @args 
    } 
    Set-Alias -Name git -Value CallGit -Description "Avoid an accidental git svn dcommit on a local branch" 
Các vấn đề liên quan