2013-07-01 68 views
3

的佈局是:混帳SVN在非標SVN倉庫佈局指定分支和標籤

Branches\ 
    Project1/ 
     Branch11/ 
     ... 
     Branch1N/ 
    Project2/ 
     Branch21/ 
    ProjectX/ # not anywhere else 
Excluded1\ 
Excluded2\ 
Excluded3\ 
Excluded4\ 
Programs\ 
    Excluded11\ 
    ... 
    Excluded1N\ 
    Project1/ # the main one 
    Project2/ 
    ... 
    ProjectN/ 
Tags\ 
    Project1/ 
     Release1/ 
     ... 
     Release69/ 

排除我設法排除 - 但我完全無法理解我怎麼能分支/標籤映射成git分支/標籤 - 最好在事實之後(每個克隆花費大約5個小時)。

請記住我是SVN的新手 - 我不知道,也不理解分支/標記系統。

我對windoz - svn2git沒有選擇(反正我很感興趣,我是如何做到這一點的克隆後或克隆更糟再次但是香草混帳
此外,我不打算以此作爲永久遷移,它將作爲SVN和dev中使用的新git repo之間的橋樑 - 所以我想保留儘可能多的信息 - 但不超過需要。在某些時候,它可能會成爲永久性的 - 在那裏當我將需要過濾掉空提交(被排除在外的項目),我想

Repo

命令:

$ git svn clone --ignore-paths="^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/" --authors-file=authors_with_emails.txt svn://svn.code.sf.net/p/oblivionworks/code/ .

克隆後(?)我有:

$ git branch -r 
    git-svn 
$ git branch 
* master 


回顧:我有cloned the thing,不包括我想排除的內容 - 現在我想說的是爲git「爲每個svn分支創建一個git分支 - 一個真正的git分支,計算增量並壓縮它們並刪除文件夾Branches - 並跟蹤它們 - 而這個(700 mb)的標籤目錄就是標籤 - 你可以做些什麼(他們做而不是對應於提交)?「
我看不出有什麼邪惡幹線

config

[core] 
    repositoryformatversion = 0 
    filemode = false 
    bare = false 
    logallrefupdates = true 
    symlinks = false 
    ignorecase = true 
    hideDotFiles = dotGitOnly 
[svn-remote "svn"] 
    ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/ 
    url = svn://svn.code.sf.net/p/oblivionworks/code 
    fetch = :refs/remotes/git-svn 
[svn] 
    authorsfile = authors_with_emails.txt 
[gui] 
    wmstate = zoomed 
    geometry = 787x377+54+59 305 1127 
[remote "github"] 
    url = https://github.com/Utumno/wrye_bash_refactoring.git 
    fetch = +refs/heads/*:refs/remotes/github/* 
[branch "master"] 
    remote = github 
    merge = refs/heads/master 

回答

2

對於分行:

使用Git的配置文件,你可以控制的SVN分公司,分別設:

[svn-remote "svn"] 
url = file:///some.url.to/svn/dir 
fetch = trunk:refs/remotes/trunk 
branches = Branches/*/*:refs/remotes/* 

所以你可以設置不同的分支引用。

好吧,你可以做同樣的標籤 - 因爲在SVN中,標籤和分支是如此相似。

branches = Tags/*:refs/remotes/* 

但是你要「真實」的Git標籤,沒問題,一旦你讓他們爲分支引用,您可以再次修改你的git回購好好git的標籤引用:

git-for-each-ref refs/remotes/origin/tags | cut -d/-f 5- | 
while read ref 
do 
git tag -a "$ref" -m"say farewell to SVN" "refs/remotes/origin/tags/$ref" 
git push origin ":refs/heads/tags/$ref" 
git push origin tag "$ref" 
done 

顯然,您需要稍微修改這些腳本以達到您的目的。

+0

將嘗試那些儘快 - 同時你能解釋一下腳本實際上做了什麼 - 特別是'[svn-remote「svn」]'?他們指的是什麼主幹? _這會得到實際壓縮到git數據庫中的「分支」嗎?如果你看看實際的回購並提供了一些示例代碼,這將有助於(至少我)。您還需要詳細闡述我不明白的映射邏輯 - 問題是回購的結構。添加配置 –

+0

另外 - 沒有主幹 - 你沒有解決創建git分支的問題 - 真正的git分支知道他們只是增量 - 所以'分支/ Project1/ Branch11 /'應該知道它是一個分支在'Programs/Project1 /' –

+0

'[svn-remote「svn」]中的文件中找到#url = svn://svn.code.sf.net/p/oblivionworks/code fetch =:refs/remotes/git-svn分支=分支/ */*:refs/remotes/*',然後是'rm .git/svn/.metadata',然後'git svn fetch',現在我的分支被解除了遠程分支 - 我從哪裏出發? '$ git的分支-a *主 遙控器/混帳svn的 遙控器/ github上/主 遙控器/ SVN分支/ CBash的/ dev-sharlikran 遙控器/ SVN分支/ Wrye%20Bash/291-修復 #。 .. remotes/svn-branches/Wrye%20Flash/Fallout%203 remotes/svn-branches/Wrye%20Flash/Fallout%20NV' –

1

我最近做了這樣的事情。

首先,我不確定爲什麼要重新排列之後的所有內容,將svn移出到git中。我懷疑這是可能的。

其次,我不會夢想在沒有svn2git的情況下這樣做。我不確定你指的是什麼Windows問題 - svn2git是用Ruby編寫的。如果我能避免它,我不會做Windows,但肯定有一個Windows實現的Ruby實現,如果沒有別的,通過Cygwin。

第三,這是關鍵,我用過濾流,以獲得SVN回購只是我想它的方式(即在形式svn2git會愉快地消費)之前轉換。這需要一些試驗和錯誤,但最終效果很好。

請參閱http://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.migratehttp://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.filtering(調整您的SVN版本的鏈接)以獲取更多信息。

編輯:我會做出這個評論,但它太長了。我認爲最好的,你就可以做的是這樣的:。

[svn-remote "svn"] 
    ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/ 
    url = svn://svn.code.sf.net/p/oblivionworks/code 
    fetch = Programs/Wrye Bash:refs/remotes/git-svn/Wrye Bash 
    branches = Branches/Wrye Bash/*:refs/remotes/git-svn/Wrye Bash/branches/* 
    fetch = Programs/Skyrim Viewer:refs/remotes/git-svn/Skyrim Viewer 
    fetch = Programs/CBash:refs/remotes/git-svn/CBash 
    branches = Branches/CBash/*:refs/remotes/git-svn/CBash/branches/* 
# etc. 

也就是說,fetch,並且,如果適用,branches線每個你感興趣的節目中一樣的答案你鏈接到,你必須清除.git/svn/.metadata文件,然後再做git svn fetch

但是這並沒有影響我以前的評論:它仍然是你的git歷史是完全線性的,並不能反映你的項目的實際分支和合並歷史。如果您將此設爲永久遷移,則這不會成爲您想要的。

+0

謝謝,但3不是一個選項 - 我說svn2git不是一個選項 - 畢竟是不是核物理 - 只有在git中才能做到。但我想在第一點上有一些意見 - 爲什麼不在事後(即克隆)?我當然可以在事後添加新的分支,所以爲什麼我不能說「嘿這個分支文件夾只是分支 - 所以吸收他們在你的對象」 –

+0

你說,_since_你在Windows上,它_followed_你無法使用svn2git。我正在質疑這個結論,並建議說,也許你可以使用svn2git。 git中的'分支'是指向特定提交的指針。沒有更多,不少。你真正想要在git中捕獲的是文件如何更改和合並的歷史_history_。 '計算差異'將涉及重播每一個變化作爲git commit,這就是git-svn所做的。不管你做什麼,它都會涉及將所有提交重新放入一個新的空git回購,無論你是從svn還是git開始。 –

+0

謝謝 - 是的,我應該編輯這個問題可能 - 我的意思是我真的不想安裝cygwin和ruby,並閱讀svn2git文檔等 - 我想通過git _only_來完成。我知道它可以在Windows中完成,但我真的寧願保持香草這一次(除其他外,因爲我想明白到底發生了什麼)。 –