[英]git-svn: how to copy git commits from one SVN branch to another?
我有一個git-svn簽出我的整個倉庫(在標准的git svn init -t tags -b branches -T trunk $repo_url
fashion中git svn init -t tags -b branches -T trunk $repo_url
,然后git svn fetch
ed)。 我手動svn copy $repo_url/branches/branch1 $repo_url/branches/branch2
。 然后我跑git svn fetch
, git checkout -b local-branch2 branch2
,做了幾次提交到branch2
, dcommit
編他們回到SVN回購協議,並正在與我的工作做完branch2
。 (為什么要分支一個分支?我想在git本地破解這個分支,但是在我工作的時候仍然會回到SVN並從幾個同事那里得到幫助)。
我沒有做的是將branch2
工作合並回branch1
。 如果我git checkout -b local-branch1 branch1
,然后git merge branch2
,它只是將我的local-branch1
指針快速轉發到branch2
所在的位置。
相反,我希望git重放自從branch2
啟動到branch1之后所做的所有提交,這樣我就可以將它們中的每一個都提交給SVN repo。 似乎有辦法做到這一點,但我想不到它。 也許git rebase
,或者在branch2
做出的每個提交的git cherry-pick
? (雖然后者有點乏味)。 我寧願不將這兩個URL合並在一起,因為這是一個很大的傷害。
想法? 這需要更多解釋嗎?
branch2上第一次不在local-branch1上的提交可能是創建branch2的提交,是嗎? 這應該在git中顯示為空提交(例如,消息,但沒有內容)。 復制其sha1標識符。 然后在local-branch1中,嘗試git reset --hard branch2 && git rebase --onto local-branch1@{1} SHA1
(其中SHA1是復制的sha1)。 這應該重播所有提交,除了空的一個返回到分支1.你很可能現在想要做一個交互式rebase並編輯每個提交,這樣你就可以去掉git-svn-id:git-svn為你添加的行(或者你可以編寫一個git-filter-branch腳本來執行此操作,如果有足夠的提交)。
出於好奇,你為什么要重播每個提交? 如果你想簡單地合並你的更改,那就更簡單了,你可以只做git checkout local-branch1 && git merge --squash branch2 && git commit
。 這將執行非快進合並,但它實際上不會產生合並提交(因為那些混淆了git-svn)。 相反,它會產生等效的工作樹,就好像合並已經發生,但只有一個父。 這反映了svn合並的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.