2012-03-28 11 views
31

core.autocrlfcore.eol + gitattributes(Tim's post is excellent)で、Git自身が行末を処理する方法にとても満足しています。git-svnはどのように行末を処理しますか?

私はautocrlftrueに設定されているWindows Gitレポを持っています。したがって、すべてのテキストファイルは、LFとしてレポに保存され、作業ディレクトリにはCRLFとして存在します。このリポジトリはSVNリポジトリからクローン化されました.SVNリポジトリは、引き続き/プルするために使用されます(SVNリポジトリは、CIなどをトリガするための中心的な、恵まれたレポです)。

しかし、プッシュ/プル操作中にgit-svnが行末を処理する方法がわかりません。

この場合、git-svnは何を説明できますか?

答えて

15

私もこれに興味があります。あなたがGitのSVNのクローンを使用して作成されたレポを持っていると仮定すると、私はあなたは、3つの異なる質問にそれを打破することができると思う:

  1. 任意のGitの改行の正規化/変更は、SVNからのコミットを移動するには、時間をフェッチのgitのsvnで起こるんgit repoに?
  2. git改行時にgit改行正規化/改変が起こるのはなぜですか?通常のローカルgitのコミット中にsvnリモートでレポにコミットしますか?マージ/リベース時間はどうですか?
  3. git newlineの正規化/改変はgit svn dcommit時に、svnに対してコミットするgitを押す/再生する際に起こりますか?

私は理論的にはこれらの質問に当てはまることになっているものを聞いてみたい、今の私は、少なくともケース#1には改行の正規化がないことを示しているようだ少し実験しました:

rem We'll make a svn repo with CRLF newlines, clone it into git with 
rem autocrlf enabled, and try to see if that results in LF-only newlines 
rem getting stored in the git repo 

cd c:\code 

rem Step 1. Prepare SVN repo with CRLF type newlines. 
rem The pre-1.4 flag is to prevent an error during git clone. 

svnadmin create --pre-1.4-compatible svnrepo 
svn checkout file:///C:/code/svnrepo svnworking 
cd svnworking 
echo "First line" > file.txt 
echo "Second line" >> file.txt 
echo "Third line" >> file.txt 
rem NOTE: At this point file.txt has CRLF newlines 
svn add file.txt 
svn commit -m "Add file.txt" 
rem NOTE: At this point file.txt still has CRLF newlines 
cd .. 

rem Step 2. Clone the svn repo into git and inspect work copy newline type 
git svn clone file:///C:/code/svnrepo gitrepo 
rem The following outputs true on my machine 
git config --get core.autocrlf 
cd gitrepo 
rem The following also outputs true on my machine 
git config --get core.autocrlf 
git svn fetch 
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines 

rem Step 3. Disable autocrlf to inspect repo's inner newline type 
rem Use the following and my editor to set core.autocrlf to false: 
git config --edit --local 
rem This now prints false: 
git config --get core.autocrlf 
git checkout . 
rem NOTE: At this point file.txt (git working dir copy) still has CRLF newlines 
del file.txt 
git checkout . 
rem NOTE: Even after explicitly deleting the old one and checking out again, 
rem file.txt still has CRLF newlines 

私のgit svn pull中にgit newline変換が行われたのであれば、これとは対照的に、file.txtはLFのみの改行をすべての最後に持たせると思います。要約すると

rem We'll a git repo with core.autocrlf on, then switch it off to 
rem pull out a file 

rem The following outputs true 
git config --get core.autocrlf 
git init gitcrtest 
cd gitcrtest 
rem The following still outputs true 
git config --get core.autocrlf 
echo "First line" > file.txt 
echo "Second line" >> file.txt 
echo "Third line" >> file.txt 
git add file.txt 
git commit -m "Add file.txt" 
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines 
rem Use the following to set core.autocrlf to false 
git config --edit --local 
git checkout . 
rem NOTE: Now file.txt (git working dir copy) has LF-only newlines 

:ここ

が実際レポはLF-改行だけを持っているかどうかの有効なテストを実装し、上記3ステップの健全性チェックです以上のことから、のgit - SVNを引いたときと思われますsvnからsvnコミットは、autocrlfが有効な場合でも、crlf変換なしでgit commitグラフに追加されます。つまり、あなたのファイルがあなたのsvnリポジトリにあるどんなタイプの改行であれ、あなたのgitクローンにも入れます。 (でも、あなたのgit 作業コピーは、改行タイプが異なるかもしれません)。

これは、 "git help attributes"の行末正規化についての議論とよく似ています。正規化は、リポジトリから作業ディレクトリ(例えば、チェックアウトやマージ)に作業を引き出すコマンドや作業ディレクトリからインデックス/リポジトリ(例:追加やコミット)に移動するコマンドのいずれかで行われます。 「Git svn fetch」はこれらのことのいずれかを行うようには見えないので、その時点で行末の正規化は行われません。私はdcommitが何をしているのかがはっきりしていないので、その時点での行末の正規化を期待するかどうかはわかりません。

あなたのレポ/マシンにSVNのsvn:eol-styleプロパティが設定されている場合は、さらに皺があります。私と思う SVNのデフォルトはではない私は100%確信していません。

更新:実際のsvn-> gitマイグレーションパースペクティブについては、Tim Abell's descriptionも参照してください。 gitの自動行末正規化がオンのままであれば、CRLF改行はgit-svnによってLF専用改行に変換されず、理想的でない結果が返されます。解決策は、gitの行末を正規化するか、行末の正規化を無効にすることでした。

+1

"私は、SVNのデフォルトは、最後に行末変換をしないことだと思う"そう、http://svnbook.red-bean.com/en/1.7/svn.advanced.propsによるとそうだ。 file-portability.html "デフォルトでは、Subversionはあなたのファイルで使用されているEOL(End-of-Line)マーカーの種類には何の注意も払っていません。 –

関連する問題