我曾尝试自动化Jon Loeliger所描述的
门卫设置,并使其正常工作。他非常详细地介绍了要执行的步骤,但“合并回到Subversion”部分相对较短。我尝试过使用git-svn进行不同的设置,还遵循了Thomas Ferris Nicolaisen提供的出色
演示/示例,并使用他的示例项目(经过修改)来测试“门卫设置”。
@echo 1. Clone Subversion repo
cd %WDIR%\devs\adm
call git svn clone -s --prefix=svn/ http://localhost/svn-repos/company-repo/websites -- username adm
cd %WDIR%\devs\adm\websites
call git reset --hard svn/trunk
@echo ----------------------------------
@echo 2. Create bare repo
cd %WDIR%\devs\adm
mkdir websites.git
cd websites.git
call git init --bare
@echo ----------------------------------
@echo 3. Populate bare with content from gatekeeper
cd %WDIR%\devs\adm\websites
call git push --all ../websites.git
call git push ../websites.git "refs/remotes/svn/*:refs/heads/svn/*"
@echo ----------------------------------
@echo 4. Setup bare as a remote in gatekeeper and fetch branches
call git remote add bare_repo ../websites.git
call git fetch bare_repo
Jon Loeliger没有描述第四步,但我猜这就是他的意思。
当需要合并回到Subversion时,请执行以下操作:
C:\tmp\devs\adm\websites>git fetch bare_repo
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ../websites
e53fba9..2ac281c svn/trunk -> bare_repo/svn/trunk
现在我们可以按照书中的步骤进行:
C:\tmp\devs\adm\websites>git checkout svn/trunk
Note: checking out 'svn/trunk'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at e53fba9... [maven-release-plugin] prepare release kaksi
C:\tmp\devs\adm\websites>git merge --no-ff remotes/bare_repo/svn/trunk
Merge made by the 'recursive' strategy.
0 files changed
create mode 100644 web/howto.txt
create mode 100644 web/readme.txt
C:\tmp\devs\adm\websites>git svn dcommit
Committing to http://localhost/svn-repos/company-repo/websites/trunk ...
A web/howto.txt
A web/readme.txt
Committed r8
A web/readme.txt
A web/howto.txt
r8 = 28da267255ae56022bd4ed3c0f4886da1ac04944 (refs/remotes/svn/trunk)
No changes between current HEAD and refs/remotes/svn/trunk
Resetting to the latest refs/remotes/svn/trunk
我的问题是这种设置(我们在书中早就被警告过了)历史记录被压缩了。
C:\tmp\devs\adm\svn\websites>svn log
------------------------------------------------------------------------
r8 | adm | 2012-05-12 23:21:11 +0200 (lø, 12 mai 2012) | 1 line
Merge remote-tracking branch 'remotes/bare_repo/svn/trunk' into HEAD
------------------------------------------------------------------------
现在考虑一下将其合并回Subversion的另一种替代方案:
C:\tmp\devs\adm\websites>git checkout -t svn/trunk
Branch trunk set up to track local ref refs/remotes/svn/trunk.
Switched to a new branch 'trunk'
C:\tmp\devs\adm\websites>git fetch bare_repo
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ../websites
c188a72..b1b4237 svn/trunk -> bare_repo/svn/trunk
C:\tmp\devs\adm\websites>git rebase remotes/bare_repo/svn/trunk
First, rewinding head to replay your work on top of it...
Fast-forwarded trunk to remotes/bare_repo/svn/trunk.
C:\tmp\devs\adm\websites>git svn reset 2147483647
r7 = c188a72da6df2966e563e9e575b626d5b449400f (refs/remotes/svn/trunk)
C:\tmp\devs\adm\websites>git svn rebase
Current branch trunk is up to date.
C:\tmp\devs\adm\websites>git svn dcommit
Committing to http://localhost/svn-repos/company-repo/websites/trunk ...
A web/howto.txt
A web/readme.txt
Committed r8
A web/readme.txt
A web/howto.txt
r8 = 18b7c7b4693cc8e55098bd716c9259ed5570acf0 (refs/remotes/svn/trunk)
No changes between current HEAD and refs/remotes/svn/trunk
Resetting to the latest refs/remotes/svn/trunk
现在提交历史记录完整:
C:\tmp\devs\adm\svn\websites>svn log
------------------------------------------------------------------------
r8 | adm | 2012-05-12 23:51:48 +0200 (lø, 12 mai 2012) | 1 line
'ola added [readme.txt, howto.txt] on svn/trunk'
为了使此设置正常工作,我们需要使用“git svn reset”命令,否则dcommit第二次将失败,因为git-svn对当前修订版本感到困惑,并且落后于(与创建裸库时相同的修订版本)。这可能是因为我们使用了rebase,而rebase又是在子版本中获取良好线性历史记录所必需的。
大问题是:“git svn reset”真正做了什么?在这种情况下,“前向重置”是否是“git svn reset”的合法用途?
开发人员<-->看门人git仓库<-->svn
的情况?如果是这样,我不明白它的优势在哪里。比起使用git-svn
而言,这个方式更好吗?除非抛弃svn,否则似乎不能真正利用git的分支/合并功能。 - dgnortongit-svn
,因为并非所有的 IDE 都支持它。EGit(Eclipse 插件)显然不支持,并且也没有即将支持的计划。 - Robert Munteanu