[英]How do I keep an svn:external up to date using git-svn?
將我的存儲庫視為SVN存儲庫,我得到:
svn co http://myrepo/foo/trunk foo
...
foo/
bar/
baz/ -> http://myrepo/baz/trunk
把它作為Git回購處理,我得到:
git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
bar/
我可以將baz克隆到其他地方的本地機器並添加一個符號鏈接,但這只是一個黑客攻擊。 有沒有辦法讓git svn rebase
在更新其他所有內容時自動引入這些更改,就像svn up
一樣?
我最終使用的解決方案只是符合我本地盒子上的其他git-svn
克隆的符號鏈接。 這非常有效:它允許我提交更改,它允許我對項目A進行本地更改,只是為了讓它們進入項目B.
我還為我做了一個腳本(Perl和Ruby變體都可用),它位於http://github.com/liyanage/git-tools/ 。
更新:我不再維護此腳本。 它在遞歸克隆和更新SVN存儲庫以及其他git相關功能的功能可以在我正在積極維護的這個新項目中找到: http : //liyanage.github.com/git-tools/
我剛寫了一個簡短的腳本,將當前HEAD
所有svn:externals
簽出到根目錄,並將它們從git倉庫中排除。
將它放到.git/hooks/post-checkout
,它會在工作樹發生變化時保持最新的外部檢查,例如由於git svn rebase
或git-checkout
。
#!/bin/bash
set -eu
revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
while read checkout_args
do
checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
svn checkout ${checkout_args}
if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
then
echo ${checkout_dirname} >> .git/info/exclude
fi
done
}
我決定寫一個“簡單”的perl腳本來處理所有這些東西。 我最近把它放到github上,嘗試一下,也許它會有所幫助: http : //github.com/sushdm/git_svn_externals/ 。
它基本上為所有發現的外部都做了git-svn克隆,它以遞歸的方式查找它們,克隆,將它們符號鏈接到適當的位置並排除所有.git_externals dirs和符號鏈接,這樣你仍然可以使用'git svn dcommit'。
祝好運。
這就是我所做的。
首先,我創建了一個空的SVN repo(與git相同的根):
svn checkout --depth empty http://path/to/repo .
這在git root中創建了空的svn repo。 關鍵是它包含SVN外部屬性。
接下來我只檢查外部(我放在PATH cygwin工具中):
svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
試試這個python腳本https://bitbucket.org/nytmyn/gitsvnext/overview
結帳svn externals在你的git存儲庫中運行
python /../gitsvnext/run update
運行它來知道要放到.git / info / exclude的內容
python /../gitsvnext/run list
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.