簡體   English   中英

如何使用裸倉庫在 svn 上鏡像 git,在 Windows 上

[英]How to mirror git on svn, on Windows, with a bare repo

有很多關於從 SVN 遷移到 git 的信息,但我正在尋找一種將 git 鏡像到 SVN 的方法,其中 git repo 是預先存在的,並且 SVN repo 需要在git repo 的內容,並隨后保持最新。 (這是一面鏡子,我不需要雙向同步)。

(為什么?因為 dev 已經遷移到 git,但管理層只信任 svn。這為我們贏得了改變態度的時間......)

我找到的最接近我想要的東西在這里,但我遇到了與那里評論中的某人相同的問題:SVN 日志被合並消息污染。

主要問題是有兩個完全獨立的歷史,並且無法永久地將它們結合起來。 git-svn 必須從現有的 svn 存儲庫開始,因此初始提交來自那里。 但我不想永久重寫我的 git 存儲庫的歷史記錄以將其建立在 SVN 初始提交的基礎上。

這個答案讓我了解了很多,我以為我已經完成了,在第一次同步時,這很好,但問題是它試圖將所有歷史從 git 重新綁定到 svn 分支,即使該分支已經包含大部分歷史記錄。 這最終會嘗試進行“向后”合並(將舊版本的文件合並到新版本中),這會產生無法解決的沖突(每次都必須再次執行)。

所以我改用櫻桃采摘了。

無論如何,這是設置:這是一個完整的演練,可以在本地創建所有內容。 它可以適應您已經擁有的任何東西。

創建裸git repo

#(create and cd to a test folder)
git --bare init bare.git

創建本地 git 工作倉庫

#(cd to test folder)
mkdir gitrepo
cd gitrepo
echo 'First content' > file.txt
git add .
git commit -m "Initial git commit"
git remote add origin [absolute path to bare.git]
git push origin master

至此,添加到本地git工作倉庫的新文件已經同步到裸倉庫。

創建空顛覆

svn mkdir --parents [path to desired svn repo including /trunk] -m "Initial commit"

將裸克隆到鏡像倉庫中

#(cd to test folder) git clone [absolute path to bare.git] mirror cd mirror code .git\\config # 我在這里使用 VSCode:編輯任何你想要的

將以下行添加到文件中:

[svn-remote "svn"]
    url = [path to svn repo including /trunk]
    fetch = :refs/remotes/git-svn

致力於 svn

git svn fetch
git rebase --onto remotes/git-svn --root master 
git svn dcommit

這從 svn 獲取空的“第一次提交”,將從裸倉庫克隆的所有更改重新綁定到它,然后 dcommits 返回到 svn。 在這一點上,所有的回購都是同步的。

(請注意,對於具有大量歷史記錄的現有存儲庫,如果master的過去歷史記錄中存在分支/合並,則可能需要進行一些手動合並)。

設置必要的分支

初始設置使我們的master指向 svn。 所以

git checkout -b svn
git checkout -B master origin/master
git checkout -b previous

這個想法是svn分支跟蹤 svn remote, master跟蹤 origin/master,而previous指向 master/svn 的最后一次同步。 通過這種方式,我們可以使用從previousmaster的提交范圍來確定要挑選的內容。

設置鈎子

要設置為自動同步到 svn 步驟,請在裸倉庫的\\hooks文件夾中創建文件post-receive 內容如下:

#!/bin/sh
#
# After receiving pushed commits, move to ;irror and update to svn
unset GIT_DIR # weird but without this, cd doesn't influence execution directory
cd ..\\mirror
git checkout master
git pull origin
git checkout svn
git cherry-pick previous..master
git svn dcommit
git checkout previous
git merge --ff master
exit

暫無
暫無

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

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