git-svn не может dcommit, даже после чистой проверки - PullRequest
7 голосов
/ 21 ноября 2010

Я пытаюсь использовать git-svn со следующим проектом:

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

, который я проверил, используя стандартный вызов git svn clone https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/ -T trunk -b branches -t tags.

У меня начались проблемы с использованием git-svn dcommit с git-svn после ветвления с git checkout -b, а не git svn branch, а затем слияния этой локальной ветки обратно в master и попытки dcommit.Теперь, как ни странно, даже после выполнения чистой проверки у меня все еще возникают ошибки при попытке dcommit.

Следующая довольно длинная трассировка представляет мой текущий рабочий процесс с git-svn:

jacob@jacob-laptop:~/workspace/gsoc2010/scxml-js$ git svn dcommit
Committing to https://jbeard@svn.apache.org/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
jacob@jacob-laptop:~/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.
jacob@jacob-laptop:~/workspace/gsoc2010/scxml-js$ git svn dcommit
Committing to https://jbeard@svn.apache.org/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

Мне нужно сделать git svn dcommit с последующим git svn rebase для каждого коммита с момента последнего dcommit.Обычно это работает чисто, но иногда не удается и требует больше ручной работы.

Что может быть причиной этой проблемы с dcommit, так что даже использование чистой проверки не решает ее?

1 Ответ

5 голосов
/ 03 декабря 2010

Я просто наткнулся на это и наконец понял, что происходит: когда вы обращаетесь к SVN-репозиторию через HTTP и через прокси-сервер , рекомендуемый хук post-commit запускает svnsync в фоновом режиме. Фиксация по HTTP заканчивается, как только сервер SVN завершает работу, но перед тем, как прокси-сервер HTTP, который вы читаете, обновляется до новой версии. git-svn делает коммит, за которым быстро следует выборка и видит устаревший HTTP-прокси без новой ревизии. Предполагается, что он получил новую ревизию и отличается от подсказки пульта с тем, что он пытался зафиксировать, и видит конфликт.

Если вы контролируете конфигурацию прокси-сервера SVN, вы можете сделать svnsync синхронным (это работало у меня долгое время, пока кто-то не удивил меня изменением конфигурации). В противном случае, я думаю, git-svn нужен механизм повтора:

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;

$

Если это покажется хорошей идеей сегодня вечером, я отправлю патч.

Обновление: при использовании этого я получил:

Author: syncuser <syncuser@d3ff0b4f-3c2c-0410-a809-ba59474314df>

на одном из моих коммитов. Таким образом, все еще может быть состояние гонки, когда сценарий видит частичную синхронизацию. Это раздражает, но не смертельно.

...