我和我的小团队使用 Git 工作,较大的团队使用 Subversion。我想安排一个 cron 作业来发布我们当前的存储库HEAD
每小时进入 SVN 存储库中的某个目录。
我以为我已经弄清楚了,但我之前写下的食谱现在似乎不起作用:
git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
cd px2
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch
git rebase trunk master
git svn dcommit
当我尝试时会发生以下情况:
% git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
Cloning into 'ProjX'...
...
% cd px2
% svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Committed revision 123.
% git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Using higher level of URL: http://me@svnserver/svn/repo/play/me/fromgit/ProjX => http://me@svnserver/svn/repo
% git svn fetch
W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: File not found: revision 100, path '/play/me/fromgit/ProjX'
W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
This may take a while on large repositories
% git rebase trunk master
fatal: Needed a single revision
invalid upstream trunk
我可以发誓这以前有效,有人有什么建议吗?谢谢。
您的方法存在一些问题:
- 您似乎正在使用预先存在的 git 存储库,而不是通过初始化的存储库
git svn init
。变基假定有一个共同的祖先,但是如果您的 git 存储库之前是通过git init
, then git svn init
将创建第二个根(即无父)提交,并且从一个提示到另一个提示的变基将无法进行--onto
.
- 您使用
-s
选项git svn init
,这会导致它搜索branches/
, tags/
, and trunk/
。作为警告(Using higher level...
)明确指出,这导致git-svn
config 指向 svn repo 的顶部,而不是fromgit/ProjX
子目录。
- 你参考
trunk
即使这个分支没有充分的理由存在;git svn init
实际上创建了一个名为的跟踪分支remotes/git-svn
.
所以你想要的实际顺序是:
# 1st time only
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
mkdir px2
cd px2
git svn init http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch
现在,黑客攻击可以同时发生在 git 和 svn 中。下次你想要的话dcommit
从 git 到 svn,你只需执行以下操作:
cd px2
git svn rebase
git svn dcommit
如果您已经初始化了 git 存储库,开始破解它,并且需要将该历史记录移植到 svn 中,那么仅首次序列会更加困难,因为您需要将所有 git 历史记录移植到 svn 中,即使它们不这样做t 有一个共同的祖先:
# 1st time only
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
cd px2
git svn init http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch
# transplant original git branch onto git-svn branch
root_commit=$( git rev-list --reverse HEAD | head -n1 )
git tag original-git
git reset --hard $root_commit
git reset --soft git-svn
git commit -C $root_commit
# N.B. this bit requires git >= 1.7.2
git cherry-pick $root_commit..original-git
# For older gits you could do
# git rev-list $root_commit..original-git | xargs -n1 git cherry-pick
# or use git rebase --onto but that requires jumping through some
# hoops to stop moving remotes/git-svn.
随后,进行同样的操作svn rebase
and dcommit
像之前一样。
如果有人想在沙箱中测试这种方法,您可以下载我的测试脚本。我建议您在运行之前进行视觉安全审核;-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)