[英]`git svn dcommit` failing on a branch
我一直在使用git-svn
與公司的svn存儲庫通信一段時間了,沒有任何大的麻煩。
今天,“頭痛”部分發生了巨大變化:
我一直在專門處理master/trunk
,需要將大多數(但不是全部!)這些變更集合並到一個新的svn分支中,該分支來自一個先前存在的svn分支。
基本上是這樣的:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master/trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
應該變成這樣的:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master/trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release
其中💩
是不應在new-versioned-release
的提交,而x🍒
是來自各個分支x
的所需提交。
所以我做了以下事情:
git checkout -b versioned-release-svn remotes/versioned-release
git svn branch new-versioned-release -m "Preparing for merge of XXX"
git checkout -b new-versioned-release-svn remotes/new-versioned-release
git cherry-pick ...
每1🍒
,解決了途中的任何沖突。 因為我想確定自己真的要針對回購協議上的正確分支,所以我運行了git svn dcommit --dry-run
,它沒有產生任何錯誤或警告,但告訴我…
Committing to svn://username@$repo-host/$repo-name/$path/branches/new-versioned-release ...
……接着是幾條diff-tree
線。
因此,我嘗試省略--dry-run
並在提交的一半途中最終導致…
Item already exists in filesystem: File already exists: filesystem '/data/subvroot/$repo-name/db', transaction '20856-g3m', path '/$path/branches/new-versioned-release/some-directory' at /usr/libexec/git-core/git-svn line 862
......和一堆不分級的變化。
除了顯而易見的“ WTF?!?”和“如何在不失去所做的一切的情況下擺脫困境”之外,我還有兩個問題:
git svn dcommit
之前:如何將本地分支dcommit到達其計划的目的地? 我為錯誤消息找到的所有內容都在某種程度上類似於我的情況,到目前為止, 這是另一個堆棧溢出問題 ,並且建議的解決方案“以某種方式[...] .git/svn
元數據目錄”並沒有引起共鳴。我很好...
有人剛剛投票贊成我的老問題,所以我想我現在應該分享我的做法。
它真的很好。
假設已經使用以下命令創建了git存儲庫
git svn clone \
--prefix svn/ \
--stdlayout \
svn://username@$repo-host/$repo-name/$path
$git_repo_name
更改為git repo,然后運行
git checkout svn/versioned-release
git svn branch new-versioned-release
這將在SVN服務器上產生以下歷史記錄:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
3⭐️ new-versioned-release
現在我要跑步
git checkout svn/new-versioned-release
git checkout -b new-versioned-release
# resulting in the following **local** history:
#
# 🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master (tracks 'svn/trunk')
# \
# \
# 2🍒--2🍒--2🍒--2🍒--2🍒--3⭐️ new-versioned-release (tracks 'svn/new-versioned-release')
這是實現我想要的基礎。
還有一個額外的提交,因為SVN中的分支與Git中的工作方式不同:創建分支始終意味着一個新的修訂版(又名提交),這就是3⭐️
來源。 並不重要,但是就在那里。
現在,我可以git cherry-pick
所有1🍒
git cherry-pick
1🍒
,最后顯示以下本地歷史記錄:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master (tracks 'svn/trunk')
\
\
2🍒--2🍒--2🍒--2🍒--2🍒--3⭐️--1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release (tracks 'svn/new-versioned-release')
現在,當我坐在git svn dcommit
new-versioned-release
git svn dcommit
new-versioned-release
上時git svn dcommit
時,SVN服務器上的歷史記錄看起來像是我想要的最終結果:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
3⭐️--1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release
唯一的區別是,從創建第三個SVN分支中獲得了額外的3⭐️
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.