svn比較 - unable to determine upstream svn information from working tree history




如何將歷史SVN倉庫遷移到新的Git倉庫? (20)

我閱讀了Git手冊,FAQ,Git - SVN速成教程等等,他們都解釋了這一點,但是你卻找不到一個簡單的指令:

SVN倉庫: svn://myserver/path/to/svn/repos

Git倉庫: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

我不指望它那麼簡單,我也不指望它是一個單一的命令。 但是,我希望不要試圖解釋任何事情 - 只是說明在這個例子中要採取什麼措施。



另一方面,git-stash命令在嘗試使用git-svn dcommits時是天賜良機。

一個典型的過程:

  1. 設置git回購
  2. 在不同的文件上做一些工作
  3. 決定使用git來檢查一些工作
  4. 決定svn-dcommit
  5. 得到可怕的“不能提交一個臟索引”的錯誤。

解決方案(需要git 1.5.3+):

git stash; git svn dcommit ; git stash apply


我強烈推薦我剛剛發現的這個簡短的屏幕錄像系列 。 作者引導您了解基本操作,並展示了一些更高級的用法。


我只是想補充我對Git的社會貢獻。我寫了一個簡單的bash腳本,它會自動採用全進口。不像其他的遷移工具,該工具依賴於本地的Git而非jGit。該工具還支持大的修正歷史,或大斑點庫。它的問世通過github上:

https://github.com/onepremise/SGMS

此腳本將轉換成存儲在SVN格式如下項目:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

該方案也很受歡迎和支持,以及:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

每個項目由項目名稱得到同步過來:

Ex: ./migration https://svnurl.com/basepath project1

如果你想充分回購了轉換,使用以下語法:

Ex: ./migration https://svnurl.com/basepath .

魔法:

$ git svn clone http://svn/repo/here/trunk

Git和SVN的運行方式非常不同。 你需要學習Git,如果你想跟踪SVN上游的變化,你需要學習git-svngit-svn手冊頁有一個很好的示例部分:

$ git svn --help

我建議在嘗試不斷使用git-svn之前先熟悉Git,即將SVN保持為集中式回購併在本地使用Git。

但是,對於所有歷史的簡單移植,以下是幾個簡單的步驟:

初始化本地回購:

mkdir project
cd project
git svn init http://svn.url

標記您想要開始導入修訂的距離:

git svn fetch -r42

(或者只是“git svn fetch”所有轉速)

實際上從那時起取得一切:

git svn rebase

您可以使用Gitk檢查導入的結果。 我不確定這是否適用於Windows,它適用於OSX和Linux:

gitk

當你在本地克隆你的SVN回購時,你可能想把它推到一個集中的Git回購協議,以便於協作。

首先創建你的空的遠程回購(也許在GitHub ?):

git remote add origin [email protected]:user/project-name.git

然後,可以選擇同步你的主分支,這樣當兩者都包含新的東西時,拉動操作將自動地將遠程主控與你的本地主控合併在一起:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

之後,你可能會有興趣嘗試我自己的git_remote_branch工具,它有助於處理遠程分支:

第一個說明文章:“ Git遠程分支機構

最新版本的跟進:“ 與git_remote_branch合作的時間


乾淨地遷移你的Subversion版本庫到一個Git版本庫 。 首先你必須創建一個將你的Subversion提交作者名稱映射到Git commiters的文件,比如~/authors.txt

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

然後,您可以將Subversion數據下載到Git存儲庫中:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

如果你在Mac上,你可以通過安裝git-core +svn從MacPorts獲得git-svn git-core +svn

如果你的Subversion版本庫和你想要的git版本庫在同一台機器上,那麼你可以在init步驟中使用這個語法,否則就是一樣的:

git svn init file:///home/user/repoName --no-metadata

一個稍微擴展的答案只使用git,SVN和bash。 它包括SVN存儲庫的步驟,不使用傳統的佈局與trunk / branches / tags目錄佈局(SVN絕對沒有執行這種佈局)。

首先使用這個bash腳本來掃描你的SVN回購為不同的貢獻者,並為映射文件生成一個模板:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <[email protected]>";
done

使用這個來創建一個authors文件,在這個文件中,你可以使用git config屬性user.nameuser.email (注意,像GitHub這樣的服務只有一個匹配的郵件就足夠了),將svn用戶名映射到用戶名和電子郵件。

然後讓git svn克隆svn倉庫到一個git倉庫,告訴它關於映射:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

這可能需要很長的時間,因為git svn將單獨檢查每個標籤或分支存在的每個修訂版本。 (請注意,SVN中的標籤只是真正的分支,所以它們在Git中是這樣的)。 你可以通過刪除SVN中不需要的舊標籤和分支來加快速度。

在同一個網絡的服務器上或在同一台服務器上運行這個功能也可以加快速度。 另外,如果由於某種原因,這個過程被中斷,你可以繼續使用

git svn rebase --continue

在很多情況下,你在這裡完成。 但是,如果你的SVN回購有一個非傳統的佈局,你只需要在SVN中有一個目錄,你想要把一個git分支,你可以做一些額外的步驟。

最簡單的方法是在你的服務器上創建一個新的SVN回購協議,並使用svn copy將你的目錄放在trunk或branch中。 這可能是唯一的辦法,如果你的目錄是在回購的根本,當我最後一次嘗試這個git svn只是拒絕做結帳。

你也可以使用git來做到這一點。 對於git svn clone只需使用你想放入git分支的目錄即可。

運行後

git branch --set-upstream master git-svn
git svn rebase

請注意,這需要Git 1.7或更高版本。


這是一個簡單的shell腳本,沒有依賴關係,可以將一個或多個SVN庫轉換為git,並將它們推送到GitHub。

https://gist.github.com/NathanSweet/7327535

在大約30行腳本中:使用git SVN克隆,從SVN :: ignore屬性創建一個.gitignore文件,推入一個純粹的git倉庫,將SVN中繼重命名為master,將SVN標籤轉換為git標籤,並將其推送到GitHub同時保留標籤。

我經歷了很多的痛苦,把十幾個SVN倉庫從Google Code移到GitHub。 這不利於我使用Windows。 Ruby在我以前的Debian盒子上被破壞,在Windows上工作是一個笑話。 其他解決方案無法使用Cygwin路徑。 即使我有一些工作,我也無法弄清楚如何讓標籤出現在GitHub上(秘密是--follow-tags)。

最後,我把上面鏈接的兩個簡短的腳本拼湊起來,效果很好。 解決方案不需要比這更複雜!


如果您正在使用SourceTree,則可以直接從應用程序執行此操作。 轉到文件 - >新建/克隆,然後執行以下操作:

  1. 輸入遠程SVN URL作為“源路徑/ URL”。
  2. 提示時輸入您的憑據。
  3. 輸入本地文件夾位置作為“目標路徑”。
  4. 給它一個名字。
  5. 在高級選項中,從“Create local repository of type”下拉列表中選擇“Git”。
  6. 您可以選擇指定要從中克隆的修訂。
  7. 命中克隆。

在SourceTree中打開回購,你會看到你的提交消息也被遷移了。

現在進入知識庫 - >知識庫設置,並添加新的遠程回購細節。 如果你願意的話,刪除SVN遠程(我通過“編輯配置文件”選項來做到這一點。

當您準備好並自由編碼時,將代碼推送到新的遠程回購。


你必須安裝

git
git-svn

從這個鏈接複製http://john.albin.net/git/convert-subversion-to-git

1.檢索所有Subversion提交者的列表

Subversion只列出每個提交的用戶名。 Git的提交有更豐富的數據,但最簡單的,提交作者需要列出一個名稱和電子郵件。 默認情況下,git-svn工具將在作者和電子郵件字段中列出SVN用戶名。 但是有了一點工作,你可以創建一個所有SVN用戶的列表,以及他們相應的Git名字和郵件是什麼。 這個列表可以被git-svn用來將普通的svn用戶名轉換成合適的Git提交者。

從本地Subversion簽出的根目錄運行以下命令:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

這將抓住所有的日誌消息,拔出用戶名,消除任何重複的用戶名,排序用戶名,並將其放置到“authors-transform.txt”文件。 現在編輯文件中的每一行。 例如,轉換:

jwilkins = jwilkins <jwilkins>

進入這個:

jwilkins = John Albin Wilkins <[email protected]>

2.使用git-svn克隆Subversion版本庫

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

這將執行標準的git-svn轉換(使用您在步驟1中創建的authors-transform.txt文件),並將git存儲庫放置在主目錄中的“〜/ temp”文件夾中。

3.將svn:ignore屬性轉換為.gitignore

如果你的svn repo使用svn:ignore屬性,你可以使用下面的命令輕鬆地將它轉換成.gitignore文件:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4.將倉庫推送到一個純粹的git倉庫

首先,創建一個裸倉庫,並使其默認分支匹配svn的“trunk”分支名稱。

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

然後將臨時存儲庫推送到新的裸存儲庫。

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

您現在可以安全地刪除〜/ temp存儲庫。

5.將“trunk”分支重命名為“master”

您的主要開發分支將被命名為“trunk”,它與Subversion中的名稱相匹配。 你需要使用以下命令將其重命名為Git的標準“主”分支:

cd ~/new-bare.git
git branch -m trunk master

清理分支和標籤

git-svn將所有的Subversions標籤都變成了“tags / name”形式的Git中非常短的分支。 您將要使用以下命令將所有這些分支轉換為實際的Git標記:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

這一步將需要一些打字。 :-)但是,別擔心, 你的Unix shell會提供一個以git for-each-ref開始的超長命令的次要提示符。


有效地使用Git與Subversion是一個溫柔的介紹混帳SVN。對於現有的SVN倉庫,混帳SVN使這個超級簡單。如果你正在開始一個新的存儲庫,它是容易很多,首先創建一個空的SVN倉庫,然後導入使用Git svn的比它在相反的方向前進。創建一個新的Git倉庫,然後導入到SVN可以做到的,但它是一個有點痛苦的,特別是如果你是新來的Git和希望保存提交歷史。


GitHub上有一個進口國。一旦你創建的存儲庫,您可以從現有的​​資源庫中導入,通過它的URL。它會要求你的憑證(如果適用),並從那裡走。

由於它的運行它會找到的作者,你可以簡單地把它們映射到用戶在GitHub上。

我現在已經用了幾個倉庫,它是相當準確的,太快很多!它花了10分鐘為一個存儲庫〜4000提交,之後花了我的朋友4天!


對於GitLab用戶我已經忍了對我從SVN如何遷移這裡要點:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

遷移步驟從SVN到GitLab

建立

  • SVN在託管svn.domain.com.au
  • SVN是通過訪問http(其他協議應該工作)。
  • GitLab在託管git.domain.com.au和:
    • A組與命名空間中創建dev-team
    • 的至少一個被創建的用戶帳戶,添加到該組,並且具有被用於(使用測試遷移一個帳號的SSH密鑰ssh [email protected])。
    • 該項目favourite-project是在創建dev-team命名空間。
  • 該文件users.txt包含了相關的用戶信息,每行一個用戶,形式username = First Last <[email protected]>,其中username在SVN日誌中給出的用戶名。(請參閱參考資料部分的詳細用戶凱西第一環節,特別是答案)。

版本

  • 顛覆版本1.6.17(r1128011)
  • Git版本1.9.1
  • GitLab版本7.2.1 ff1633f
  • Ubuntu的服務器14.04

命令

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git push --set-upstream gitlab master

而已! 刷新在GitLab網絡用戶界面項目頁面,你會看到所有的提交和文件現在上市。

筆記

  • 如果有未知用戶,該git svn clone命令將停止,在這種情況下,更新users.txtcd favourite-projectgit svn fetch會繼續從停止的地方。
  • 標準trunk- tags- branches為SVN版本庫佈局是必要的。
  • 給予的SVN URL git svn clone命令在一級立即停止以上trunk/tags/branches/
  • git svn clone命令會產生大量輸出,包括在頂部一些警告; 我忽略了警告。

我已經發布了一步一步的指導( 這裡 )將svn轉換為git,包括將svn標籤轉換為git標籤和svn分支到git分支。

簡潔版本:

1)從特定版本號克隆svn。 (修訂版號必須是您要遷移的最早的版本號)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2)獲取svn數據。 這一步,這是最花時間的一步。

cd gitreponame
git svn fetch

重複git svn獲取直到完成沒有錯誤

3)更新主分支

git svn rebase

4)通過複製引用從svn分支創建本地分支

cp .git/refs/remotes/origin/* .git/refs/heads/

5)將svn標籤轉換成git標籤

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6)把倉庫放在更好的地方,比如github

git remotes add newrepo [email protected]:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

如果你想要更多的細節,請閱讀我的帖子或問我。



沒有標籤,也沒有分支轉換子模塊的svn /文件夾“MyModule的”混帳到與歷史。

為了保持SVN忽略列表使用上述意見第1步後


有不同的方法來實現這一目標。我已經嘗試了一些人,發現真正的工作一個安裝在Windows操作系統只是Git和SVN。

先決條件:

  1. 在Windows上的git(我用這個)https://git-scm.com/
  2. 安裝控制台工具svn的(我用龜SVN)
  3. 轉儲你的SVN倉庫的文件。 svnadmin dump /path/to/repository > repo_name.svn_dump

步驟來實現最終目標(遠程移動與歷史上所有倉庫的混帳,首先本地的Git,然後)

  1. 創建空庫(使用控制台工具或TortoiseSVN的)目錄REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER,把dumpfile.dump到REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump 等待這個操作,也可能是長

  3. 這個命令是無聲的,所以開第二cmd窗口:svnserve -d -R --root REPO_NAME_FOLDER為什麼不直接使用file:/// ......?導致下一個命令將失敗Unable to open ... to URL:,多虧了答案https://.com/a/6300968/4953065

  4. 創建新的文件夾SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. 混帳SVN克隆的svn:此操作//本地主機/等待。

最後,我們怎麼得了?

讓我們檢查我們的本地庫:

git log

查看您之前提交?如果是的話 - 沒關係

所以,現在你有你的來源和舊SVN歷史功能齊全本地的Git倉庫。現在,如果你想將其移動到某些服務器,使用下面的命令:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

就我而言,我已經不需要標記命令導致我的回購協議不具有標籤。

祝你好運!


創建一個用戶文件(即users.txt )將SVN用戶映射到Git:

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

您可以使用這一行代碼從現有的SVN存儲庫構建模板:

svn log --xml | grep "<author>" | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' | tee users.txt

如果發現缺少SVN用戶不在文件中,SVN將停止。 但在此之後,您可以更新文件和提取您離開的地方。

現在從存儲庫中取出SVN數據:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

這個命令將在dest_dir-tmp創建一個新的Git倉庫,並開始提取SVN倉庫。 請注意,“--stdlayout”標誌意味著您有共同的“trunk /,branches /,tags /”SVN佈局。 如果你的佈局不同,熟悉--tags ,-- --branches ,-- --branches選項(一般git svn help )。

所有常見的協議都是允許的: svn://http://https:// 。 該網址應該以http://svn.mycompany.com/myrepo/repository為目標 。 那一定不能包含/trunk/tag/branches

請注意,在執行這個命令之後,它經常看起來像是“掛起/凍結”操作,並且在初始化新的存儲庫之後很長時間卡住是非常正常的。 最終你會看到日誌消息,表明它正在遷移。

還要注意的是,如果你省略了--no-metadata標誌,Git會在提交消息中附加關於相應SVN修訂版本的信息(例如git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>

如果找不到用戶名,請更新您的users.txt文件,然後:

cd dest_dir-tmp
git svn fetch

如果你有一個很大的項目,你可能需要多次重複上一個命令,直到所有的Subversion提交都被提取出來為止:

git svn fetch

完成後,Git會將SVN trunk檢入到一個新的分支。 任何其他分支設置為遙控器。 您可以通過以下方式查看其他SVN分支:

git branch -r

如果你想在你的倉庫中保存其他遠程分支,你想為每一個分支手動創建一個本地分支。 (跳過主幹/主)。如果你不這樣做,分支將不會在最後一步克隆。

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

標籤是作為分支導入的。 你必須創建一個本地分支,製作一個標籤並刪除分支,把它們作為Git中的標籤。 用標籤“v1”來做:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

將你的GIT-SVN庫克隆到一個乾淨的Git倉庫中:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

您之前從遠程分支創建的本地分支只會被作為遠程分支複製到新克隆的存儲庫中。 (跳過中繼線/主站。)對於每個要保留的分支:

git checkout -b local_branch origin/remote_branch

最後,從乾淨的Git存儲庫中刪除指向現在已刪除的臨時存儲庫的遠程文件:

git remote rm origin




git-svn