簡體   English   中英

將svn轉換為git,如何讓svn repo中的分支不僅僅是遠程的?

[英]Converting svn to git, how to get the branches not to be just remote in the svn repo?

我是git的新手,我正在嘗試將svn存儲庫移動到git。 我按照下面的指南,所以現在我的服務器上有一個git repo
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/

所以,如果我做“git branch”git回復“* master”,如果我做“git branch -r”,我會得到svn存儲庫中所有分支的列表。

我的最后一個svn-checkins已經在其中一個分支中,但當我執行“git svn clone”-stuff我在該分支中的提交(它們尚未合並到主干中)在我的(git)主分支中可見。 我在這里錯過了什么?

此外,如果我在我的開發機器上做“git clone”我得到的文件沒問題。 但如果我做“git branch -r”我只能看到主分支而不是遠程分支“。

由於我們一起擺脫了svn-repo,我希望在git-repo中擁有所有svn分支,以便可以從開發人員客戶端訪問它們。

再一次,我不是一個完全的新手,但離它不遠。 所以如果有一些基本的東西我在這里失蹤請告訴我。

更新
在做了一些RTFM(man git-svn)后,我解決了主分支中存在分支內容的第一個問題

重置 - 硬件遙控器/主干

現在主干和主分支是一樣的。 現在,接下來將弄清楚如何從開發客戶端獲取分支。

更新2
我通過結合上面的url和Scott指出的url來實現它。 所以,從一開始。

我首先在服務器上創建了一個空的存儲庫,它們保存在我們服務器上的/ usr / local / git-repos中:

server> cd /usr/local/git-repos
server> mkdir my_project.git
server> cd my_project.git
server> git init

然后我將svn-repository克隆到我的dev-machine(注意,在我們的svn服務器上,“branches”dir被稱為“branch”,而不是 's'):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project

然后進行一些清理以按順序獲取標簽和分支:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
dev> rm -Rf .git/refs/remotes/tags
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/
dev> rm -Rf .git/refs/remotes

現在將我的服務器添加為遠程存儲庫:

dev> git remote add origin jorgen@<our_server>:/usr/local/git-repos/my_project.git

最后,將所有分支和標記推送到服務器:

dev> git push origin --all

Phew,現在你有它,現在我可以擺脫那個svn-repo。

更新3
Checkout ebneters發布在下面,以便更輕松地完成這項工作......

關於如何進行相當好的SVN導入有一個相當詳細的解釋,解釋了如何在這里正確轉換分支:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

簡短的回答就是運行:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes

希望這很有幫助。

另一個好方法,只是為了記錄,是使用svn2git - 我正在轉換幾個相當大的存儲庫,它一直是天賜之物。 它自動執行處理分支和將svn標記轉換為真正的git標記所需的所有步驟。

斯科特的解決方案對我不起作用。 我懷疑git-svn的最新版本可能已經發生了變化,因為他發布了(並且自編寫鏈接的書籍以來),因為它似乎在克隆完成后立即進行垃圾收集。 但這只是猜測為什么它不起作用。 我正在使用git 1.6.5.6。

具體來說,我的.git / refs / remotes目錄是完全空的,除了一個標簽目錄,它也是空的。 所以我無法復制任何東西以使其正確。

經過一番探討之后,我能夠通過檢查文件.git / packed-refs以及對以下內容執行搜索和替換來解決此問題(按此順序):

refs/remotes/tags => refs/tags
refs/remotes => refs/heads

如果您的編輯器是vim,則可以使用以下兩個命令執行此操作:

:%s/refs\/remotes\/tags/refs\/tags/g
:%s/refs\/remotes/refs\/heads/g

svn2git 1.3.1也沒有為我生成可用的結果(幾個月前的某個點之后沒有導入任何提交,並且所有分支都顯示相同的提交)。 現在我已經放棄了svn2git並且使用git-svn和上面的結果取得了最大的成功。

一廂情願的想法:如果git-svn只是添加了一個像'放棄'或'遷移'這樣的命令,那將會很好,這將會以一種面向未來的方式自動化這個過程。

我已經按照Scott的配方將一個2 svn repos遷移到git(git版本1.7.0.4),一個較小的和一個較大的配方。 較小的一個表現如斯科特在書中所描述的那樣。 較大的一個需要David的解決方案。 另一件事是

$ git push origin --all

沒有推任何標簽,而是我不得不這樣做:

$ git push origin --all
$ git push origin --tags

這可能不是從標志 - 所有和書籍章節中顯而易見的,我在刪除了本地git svn repo之后意識到了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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