簡體   English   中英

git svn dcommit在分支上失敗

[英]`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的所需提交。

所以我做了以下事情:

  1. git checkout -b versioned-release-svn remotes/versioned-release
  2. git svn branch new-versioned-release -m "Preparing for merge of XXX"
  3. git checkout -b new-versioned-release-svn remotes/new-versioned-release
  4. 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?!?”和“如何在不失去所做的一切的情況下擺脫困境”之外,我還有兩個問題:

  1. 假設我回到git svn dcommit之前:如何將本地分支dcommit到達其計划的目的地?
  2. 現在看來,這顯然不是實現我想要的目標的正確方法……但是應該怎么做呢?

我為錯誤消息找到的所有內容都在某種程度上類似於我的情況,到目前為止, 這是另一個堆棧溢出問題 ,並且建議的解決方案“以某種方式[...] .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM