5

単一のファイルを git リポジトリから別の場所 (作業ディレクトリ以外) にチェックアウトし、現在の作業ディレクトリをそのままにしたいと考えています。そして、gitに正しい行末でファイルをチェックアウトさせたいです。

私はWindowsで作業していますが、Linuxでも同じ問題があります。

これが私のシナリオです(Win7 64ビット):

最初に、git がコミット時に CRLF を LF に変換し、チェックアウト時に LF を CRLF に変換することを確認します。

git config --local core.autocrlf true

次に、CRLF 行末を持つ crlf.txt というファイルを作成し、コミットします。

git add crlf.txt
git commit -m "File with crlf"

crlf.txt で何かを変更してコミットします。

git add crlf.txt
git commit -m "Change in crlf.txt"

今、最初のコミットのように crlf.txt を取得したい:

git show HEAD~1:crlf.txt > "/home/user/crlf_like_in_head-1.txt"

ファイル「crlf_like_in_head-1.txt」には、CRLF は含まれていませんが LF が含まれています。リポジトリにあるようにファイルの内容を表示するため、git show は正しいと思います (core.autocrlf=true は CRLF を LF に変換します)。ドキュメントからそれを知っており、core.autocrlf = falseで同じことを試しました。core.autocrlf=false を使用すると、「crlf_like_in_head-1.txt」に CRLF が含まれます。LF を CRLF に簡単に変換できることはわかっていますが、結果ファイルが git でチェックアウトされたものと同じであることを確認する必要があります。

git checkout を使用して単一のファイルをチェックアウトすることもできます。

git checkout HEAD~1 crlf.txt

しかし、作業ディレクトリにある crlf.txt の現在の内容が上書きされ (crlf.txt がダーティ状態の場合も)、git checkout を使用して別のフォルダーにチェックアウトできません。

4

1 に答える 1

1

その通りですgit show。レポにあるものを表示するだけです。チェックアウト マジックは行われません。

チェックアウト用の作業ディレクトリの場所を一時的に変更することで、目的を達成できます

git --work-tree=/home/user checkout HEAD~1 crlf.txt

これにより、ファイルが にチェックアウトされます/home/user/crlf.txt注:サブディレクトリ内のファイルをチェックアウトすると、そのディレクトリもターゲット フォルダに作成されます。それを防ぐことも、ターゲット ファイルのファイル名を指定することもできません。それが問題になる場合は、一時ディレクトリにチェックアウトしてからチェックアウトしたファイルを移動する 2 行のシェル スクリプトを作成する必要があります。

于 2012-12-05T08:54:25.830 に答える