2014-02-21 66 views
1

在我的Linux機器上,我同時使用SVN和Git。如何讓git-svn使用特定版本的SVN?

爲了讓我的生活更輕鬆,我添加 源/opt/svn/linux64/ix86/svn_1.8.5/interface/startup/svn_1.8.5_64.env 我.bashrc,從而書寫 SVN -version 顯示1.8如預期的那樣。

但是當這個git-svn結帳失敗。這發生在Git 1.7.10.1中,並且是已知的不兼容性(see for example here)。

我可以很容易地通過source ing SVN版本1.7.9解決它。但是這需要我重新啓動SSH連接。然後再執行git-svn操作重新啓動。 (在這兩種情況下,.bashrc必須編輯!)

我也可以切換到SVN 1.7.9,但這將需要我降級所有SVN工具,包括我在Windows機器上使用的TortoiseSVN(以及我不時在共享網絡驅動器上籤出結賬時使用)。因此,有一種「非侵入式」的方式(所以我可以只爲自己做 - Linux在共享服務器上!)使git-svn使用1.7.9版本,而命令行仍將使用1.8。 5?


/opt/svn/linux64/ix86/svn_1.8.5/interface/startup/svn_1.8.5_64.env包含以下:

add_to_env() 
{ 
old_value=`eval echo '$'${1}` 
eval ${1}=`echo ${old_value}|awk '{ n=split($1,parts,":"); printf "%s", toadd ; 
for (i = 1; i <= n; ++i) if (toadd != parts[i] ) printf ":%s", parts[i]; }' toadd=${2}` 
} 

if [ -n "$SVN_STARTUP" ]; then 
    SVN_TMP=$SVN_STARTUP 
    unset SVN_STARTUP 
    . $SVN_TMP 
else 
    # setum and setmake can overrule SVN_VERSION 
    if [ -z "$SVN_VERSION" ]; then 
    export SVN_VERSION=svn_1.8.5 
    fi 
    export SVN_HOME=/opt/svn/linux64/ix86/$SVN_VERSION 
    add_to_env PATH $SVN_HOME/bin 
    export PATH 
    add_to_env MANPATH $SVN_HOME/share/man 
    export MANPATH 
    add_to_env LD_LIBRARY_PATH $SVN_HOME/lib 
    export LD_LIBRARY_PATH 
fi 

至於的Perl:

  • perl --version顯示5.8.8,
  • which perl顯示/usr/bin/perl這不是一個鏈接,/usr/bin也含有perl5.8.8這似乎是(通過diff)是相同的,
  • find/-name Ra.pm的發現(到目前爲止...)/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/SVN/Ra.pm
+1

svn_1.8.5_64.env文件中包含了什麼內容?這不是Subversion的一部分,因此它必須是您的打包者或系統管理員爲您設置的東西。 –

+0

@BenReser我已經添加了這個問題。 –

+0

我在系統上添加了一些關於Perl的細節。 –

回答

1

首先,這個環境腳本並沒有真正改變你完全綁定到Subversion。事實上,它實際上是將綁定與某些其他版本的庫混合在一起。一般來說,這很可能會起作用,因爲Subversion會努力保持我們的API兼容,並且最終應該使用相同版本的各種Subversion庫(這很重要)。

爲了正確使用與庫一起使用的Subversion Perl綁定,您需要添加Perl綁定所在的路徑。 Perl用PERL5LIB環境處理這個問題。這與您的PATHLD_LIBRARY_PATH環境變量類似。其他語言需要類似的東西(但git-svn只使用Perl,因此在這種情況下不重要)。

除此之外,您應該能夠在shell中獲取腳本以更改庫,因爲它將庫添加到值的起始位置(將按給定順序進行搜索)。所以你應該能夠運行source envfile. envfile

如果你想要,你可以簡單地用這樣的東西包裝git,並把它放在你的路徑(你可以別名,但腳本不會看到它)。

#!/bin/bash 

. /opt/svn/linux64/ix86/svn_1.7.9/interface/startup/svn_1.7.9_64.env 
export PERL5LIB="$SOMEPATHTOPERLLIBS:$PERL5LIB" 

git "[email protected]" 

其中$ SOMEPATHTOPERLLIS被替換爲安裝中Perl5文件的實際路徑。我無法告訴你這在系統之間會有什麼變化。如果您搜索名爲Ra.pm的文件,您通常可以找到一般區域。你只需要指出你在哪裏找到了這個文件的幾個級別。

+0

我在問題的機器上添加了關於Perl的一些細節。 –

+0

首先,我嘗試了上面的腳本,它不起作用。我嘗試了從'/ usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/SVN /'到'/ usr/lib64/perl5 /'的所有路徑變體。 –

+0

其次,一旦我們解決了工作本身的問題,如何使其「透明」,以便我可以編寫'git'並讓腳本被調用而不是實際的Git?但是不要在該腳本中綁定Git路徑,而是使用'.bashrc'中的源代碼? –

相關問題