2010-11-21 20 views
6

Tôi đang cố gắng sử dụng git-svn với dự án sau:git-svn không dcommit, ngay cả sau khi thanh toán sạch

https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/

Mà tôi đã kiểm tra bằng cách sử dụng các tiêu chuẩn git svn clone https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/ -T trunk -b branches -t tags gọi.

Tôi bắt đầu gặp sự cố khi sử dụng git-svn dcommit với git-svn sau khi phân nhánh với git checkout -b và không git svn branch và sau đó hợp nhất chi nhánh địa phương đó thành chính và cố gắng chấp nhận. Bây giờ, thật kỳ lạ, ngay cả sau khi thanh toán sạch sẽ, tôi vẫn gặp lỗi khi tôi cố gắng chấp nhận.

Sau đây dấu vết khá dài là đại diện của công việc hiện tại của tôi với git-svn:

[email protected]:~/workspace/gsoc2010/scxml-js$ git svn dcommit 
Committing to https://[email protected]/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk ... 
     M  build-common.xml 
     M  src/xslt/backends/js/StateTableStatechartGenerator.xsl 
     M  src/xslt/backends/js/SwitchyardStatechartGenerator.xsl 
     M  src/xslt/ir-compiler/appendTransitionInformation.xsl 
     M  src/xslt/ir-compiler/copyEnumeratedEventTransitions.xsl 
     M  src/xslt/ir-compiler/flattenTransitions.xsl 
     M  src/xslt/ir-compiler/nameTransitions.xsl 
     M  src/xslt/ir-compiler/numberStatesAndTransitions.xsl 
     M  src/xslt/ir-compiler/splitTransitionTargets.xsl 
     M  src/xslt/util/language-frontend-module-generators/sh-from-topo-sort-list-generator.xsl 
     M  src/xslt/util/topo-sort.xsl 
Committed r1037491 
W: 502073c202cb1fbe089f0e8b7100304f0aa74729 and refs/remotes/trunk differ, using rebase: 
:100644 100644 7930fd690be01a5716490704b5556e2b5cab5ba6 51047f2c8cf1daaa94ae44433a9aa2acc222ae43 M  build-common.xml 
:040000 040000 59251941b33bda1376881b33bb2263ea87b1b947 2f5e2586e26bc7d05def065cfcf05327982b81d7 M  src 
Current branch master is up to date. 
# of revisions changed 
before: 
39c6f7e2d7b82cc782b8770d1ddb0ecb4f86e780 
c5f360feb3a6bdaab2fb2f48d05e8691824e3231 

after: 
502073c202cb1fbe089f0e8b7100304f0aa74729 
39c6f7e2d7b82cc782b8770d1ddb0ecb4f86e780 
c5f360feb3a6bdaab2fb2f48d05e8691824e3231 
If you are attempting to commit merges, try running: 
     git rebase --interactive --preserve-merges refs/remotes/trunk 
Before dcommitting 
[email protected]:~/workspace/gsoc2010/scxml-js$ git svn rebase 
     M  build-common.xml 
     M  src/xslt/ir-compiler/nameTransitions.xsl 
     M  src/xslt/ir-compiler/copyEnumeratedEventTransitions.xsl 
     M  src/xslt/ir-compiler/appendTransitionInformation.xsl 
     M  src/xslt/ir-compiler/flattenTransitions.xsl 
     M  src/xslt/ir-compiler/numberStatesAndTransitions.xsl 
     M  src/xslt/ir-compiler/splitTransitionTargets.xsl 
     M  src/xslt/backends/js/SwitchyardStatechartGenerator.xsl 
     M  src/xslt/backends/js/StateTableStatechartGenerator.xsl 
     M  src/xslt/util/language-frontend-module-generators/sh-from-topo-sort-list-generator.xsl 
     M  src/xslt/util/topo-sort.xsl 
r1037491 = e8d820cfdca882a57fbfa003b9673313be6c9621 (refs/remotes/trunk) 
First, rewinding head to replay your work on top of it... 
Applying: Changed some paths around so python fronend works. 
Applying: Removed test_with_xsltproc.sh. This file no longer needed, as we now generate a bash backend module. 
[email protected]:~/workspace/gsoc2010/scxml-js$ git svn dcommit 
Committing to https://[email protected]/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk ... 
     M  src/python/scxml/cgf/backends/js 
     M  src/python/scxml/cgf/xslt 
Committed r1037493 
W: 8563b885bfca77ccb33a87f56f78e6323af022a9 and refs/remotes/trunk differ, using rebase: 
:040000 040000 c33b3d66ecc6735af3241d7f9cee383d2736f614 59251941b33bda1376881b33bb2263ea87b1b947 M  src 
Current branch master is up to date. 
# of revisions changed 
before: 
574e2e495fa12cf3d81004638a06e3315d0abba5 

after: 
8563b885bfca77ccb33a87f56f78e6323af022a9 
574e2e495fa12cf3d81004638a06e3315d0abba5 
If you are attempting to commit merges, try running: 
     git rebase --interactive --preserve-merges refs/remotes/trunk 
Before dcommitting 

tôi về cơ bản cần phải làm một git svn dcommit theo sau là một git svn rebase cho mọi cam kết kể từ khi dcommit ngoái. Điều này thường hoạt động một cách sạch sẽ, nhưng đôi khi thất bại và yêu cầu công việc thủ công hơn.

Điều gì có thể gây ra vấn đề này với dcommit, chẳng hạn việc sử dụng thanh toán sạch sẽ không giải quyết được vấn đề này?

+1

Điều duy nhất tôi có thể nghĩ là máy chủ SVN từ xa đang nhả cam kết bằng cách nào đó, để kết quả SVN cam kết không 100% khớp với cam kết Git mà bạn vừa mới đẩy. Bạn có thể thử tạo một nhánh mới tại cùng nhánh mà bạn đang dcommitting (để các commit được giữ lại) và diff giữa một commit được đẩy vào SVN và commit Git tương ứng với nó để xem nếu đó là trường hợp. – cdhowie

Trả lời

5

Tôi chỉ chạy vào điều này và cuối cùng đã tìm ra điều gì đang diễn ra: Khi bạn truy cập kho SVN qua HTTP và write-through proxying, móc post-commit được đề xuất chạy svnsync ở chế độ nền. Cam kết thông qua HTTP kết thúc ngay sau khi máy chủ SVN được thực hiện, nhưng trước khi proxy HTTP bạn đọc qua đã được cập nhật lên bản sửa đổi mới. git-svn thực hiện cam kết nhanh chóng theo sau một lần tìm nạp và xem proxy HTTP cũ mà không cần sửa đổi mới. Nó giả định nó có bản sửa đổi mới và thay đổi phần đầu của điều khiển từ xa với những gì nó đã cố gắng cam kết và thấy xung đột.

Nếu bạn kiểm soát cấu hình proxy SVN, bạn có thể thực hiện đồng bộ svnsync (điều này làm việc cho tôi trong một thời gian dài cho đến khi ai đó làm tôi ngạc nhiên với thay đổi cấu hình). Nếu không, tôi nghĩ rằng git-svn cần có cơ chế thử lại:

diff --git a/git-svn.perl b/git-svn.perl 
index 09c4ca5..af9aea1 100755 
--- a/git-svn.perl 
+++ b/git-svn.perl 
@@ -57,6 +57,7 @@ use File::Spec; 
use File::Find; 
use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/; 
use IPC::Open3; 
+use Time::HiRes qw/usleep/; 
use Git; 

BEGIN { 
@@ -574,7 +575,17 @@ sub cmd_dcommit { 
           $gs->{inject_parents_dcommit}->{$cmt_rev} = 
                   $parents->{$d}; 
         } 
-      $_fetch_all ? $gs->fetch_all : $gs->fetch; 
+      my $retry; 
+      fetch: for ($retry = 0; $retry < 30; ++$retry) { 
+       $_fetch_all ? $gs->fetch_all : $gs->fetch; 
+       last fetch if ($gs->rev_map_max >= $cmt_rev); 
+       # Asynchronous commit push not complete 
+       usleep(20000 * ($retry + 1)); 
+      } 
+      if ($retry > 0 && $gs->rev_map_max < $cmt_rev) { 
+       fatal "New revision $cmt_rev did not appear", 
+         "in repository after $retry retries."; 
+      } 
         $last_rev = $cmt_rev; 
         next if $_no_rebase; 

$ 

Nếu điều này vẫn có vẻ như ý hay, tối nay tôi sẽ gửi bản vá.

Cập nhật: Trong khi sử dụng này tôi đã kết thúc với:

Author: syncuser <[email protected]> 

trên một trong những cam kết của riêng tôi. Vì vậy, vẫn có thể có điều kiện chủng tộc trong đó tập lệnh nhìn thấy một phần đồng bộ hóa. Điều này gây phiền nhiễu nhưng không gây tử vong.

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng giải pháp này có thể sẽ làm việc, nhưng tôi đã tìm thấy một cách khác để giải quyết vấn đề. Tôi đang ở châu Âu ngay bây giờ, và svn.apache.org minh bạch ánh xạ tới svn.eu.apache.org, là một tấm gương của svn.us.apache.org. Tôi đoán cam kết với gương không hoạt động tốt, có thể cho vấn đề bạn đã đề cập. Tuy nhiên, bằng cách nhân bản rõ ràng từ svn.us.apache.org, dcommit bây giờ có vẻ hoạt động tốt. – jbeard4

+0

Chỉ cần một lưu ý cho bản thân mình rằng tôi cam kết một rev với 5 bitfiles FPGA bằng cách sử dụng bản vá của tôi (ở trên) và thậm chí sau 30 retries proxy đã không nhìn thấy phiên bản mới (để chờ đợi khoảng 10s). Bleah. –

Các vấn đề liên quan