簡體   English   中英

如何使用git-svn保持svn:external最新?

[英]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一樣?

將svn externals與我見過的git-svn集成的最佳方法就是這個腳本 ,它將你的外部代碼克隆到.git_externals /目錄中,並創建符號鏈接並排除你需要的文件。 我發現這是一個簡單而直接的解決方案。 因人而異。

以下是使用git-svn處理svn外部的其他選項的舊概述 對我來說,他們看起來有點過於復雜,並且在隨后的Git使用中可能會中斷。

我最終使用的解決方案只是符合我本地盒子上的其他git-svn克隆的符號鏈接。 這非常有效:它允許我提交更改,它允許我對項目A進行本地更改,只是為了讓它們進入項目B.

我還為我做了一個腳本(Perl和Ruby變體都可用),它位於http://github.com/liyanage/git-tools/

  • 遞歸檢出所有svn:externals
  • 如果大型存儲庫的克隆中途中止,則可以重復運行。 發生了很多事。 它從它停止的地方開始。
  • 添加它找到的所有svn:externals條目並處理為.git / info / exclude
  • 將遇到的所有svn:ignore條目添加到.git / info / exclude
  • 可以在第一次運行后定期運行,在所有克隆的子沙箱中執行svn:rebase,發現新的外部和新的svn:ignores

更新:我不再維護此腳本。 它在遞歸克隆和更新SVN存儲庫以及其他git相關功能的功能可以在我正在積極維護的這個新項目中找到: http//liyanage.github.com/git-tools/

我剛寫了一個簡短的腳本,將當前HEAD所有svn:externals簽出到根目錄,並將它們從git倉庫中排除。

將它放到.git/hooks/post-checkout ,它會在工作樹發生變化時保持最新的外部檢查,例如由於git svn rebasegit-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
}

僅供記錄:我遵循了這個建議並嘗試使用SmartGit來處理svn:externals

到目前為止,SmartGit是我見過Git的最佳GUI客戶端。 關於svn:externals ,它不僅正確地獲取它們,而且還提供了執行外部存儲庫的“快速快照”(只讀,僅HEAD克隆)的選項。

不幸的是,它不是免費的商業用途(我發現許可證價格有點太高 - 是的,我是一個小氣鬼)。 但它可以免費用於非商業目的。

我決定寫一個“簡單”的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.

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