DOS 形式 (\r\n
行末) のファイルがいくつかある Git リポジトリがあります。ファイルを実行したいだけですがdos2unix
(すべてのファイルを UNIX 形式に変更し、\n
行末を付けます)、これは履歴にどの程度影響しますか? また、推奨されますか?
ソース管理されたファイルには常に UNIX の行末を使用し、オプションで OS 固有の行末にローカルで切り替えるのが標準だと思いますか?
DOS 形式 (\r\n
行末) のファイルがいくつかある Git リポジトリがあります。ファイルを実行したいだけですがdos2unix
(すべてのファイルを UNIX 形式に変更し、\n
行末を付けます)、これは履歴にどの程度影響しますか? また、推奨されますか?
ソース管理されたファイルには常に UNIX の行末を使用し、オプションで OS 固有の行末にローカルで切り替えるのが標準だと思いますか?
この crlf は、svn から git (中心的な (裸の) ような) scm 環境に変換したときに私たちを夢中にさせました。最終的に得られたのは、グローバル .gitconfig ファイルを全員のユーザー ルート (Windows と Linux の両方) にコピーしたことです。最初のファイルは Windows システムからのもので、core.autocrlf=true と core.safecrlf=false があり、大混乱を引き起こしました。 Linuxユーザーの場合(bashスクリプトが機能せず、すべてのひどい^ Mのように)。そのため、これらのコマンドの後に dos2unix を実行するチェックアウトおよびクローン スクリプトを最初に実行しました。次に、core.autocrlf および core.safecrlf 構成項目に出くわし、O/S に基づいて設定しました。
Windows: core.autocrlf=true および core.safecrlf=false Linux: core.autocrlf=input および core.safecrlf=false
---Windows の場合 ---
git config --global core.autocrlf true
git config --global core.safecrlf false
---Linux の場合---
git config --global core.autocrlf input
git config --global core.safecrlf false
次に、Linux 開発者のために、小さな bash スクリプト /usr/local/bin/gitfixcrlf をセットアップします。
#!/bin/sh
# remove local tree
git ls-files -z | xargs -0 rm
# checkout with proper crlf
git checkout .
これは、ローカル サンドボックス クローンで 1 回だけ実行する必要がありました。今後のクローン作成はすべて正しく行われました。今後のプッシュ プルが正しく処理されるようになりました。したがって、これにより、改行に関する複数の O/S 問題が解決されました。また、Mac は Linux と同じ構成に分類されることに注意してください。
使用する必要があるアプローチは、リポジトリがどの程度公開されているかによって異なります。
多かれ少なかれそれを使用しているのはあなただけなので、すべての SHA を変更することを気にしたり気にしたりしないが、この問題を常に整理したい場合は、 a を実行して、各コミットのすべてのファイルにgit filter-branch
適用できます。dos2unix
(リポジトリを共有している場合、他の全員がリポジトリを完全に更新する必要があるため、これは潜在的に危険です。)
したがって、より良いオプションであり、より簡単な方法は、現在のヘッドでのみ変更することです。これは、過去のコミットにはまだ\r\n
エンディングがあることを意味しますが、過去から多くのチェリーピッキングを行っていない限り、これは問題にはなりません。もちろん、差分ツールはもう少し頻繁に文句を言うかもしれませんが、通常は近くのコミットとのみ差分をとるので、この問題はコミットが蓄積するにつれて自然に解決します。
そして、UNIX の行末は標準です。それについては正しいです。最良の方法は、ウィンドウでもこれらのエンディングのみを書き込むようにエディターをセットアップすることです。それ以外の場合は、autocrlf
使用できる設定もあります。
履歴書き換え部分への追加:
前回同じことをしたときは、次のコマンドを使用してすべてのファイルを UNIX 末尾に変更しました。
#!/bin/bash
all2dos() { find * -exec dos2unix {} \; }
export -f all2dos
git filter-branch -f --tree-filter 'all2dos' --tag-name-filter cat --prune-empty -- --all
継続的な解決策については、core.autocrlf (および core.safecrlf) のconfig parametersをご覧ください。
リポジトリ全体に対してこれを 1 回行うと、マージがほぼ不可能な 1 つのコミットが作成されるだけですが (これらのファイルのすべての行が変更されるため)、それを乗り越えれば大したことではありません。(はい、履歴全体を変更するために使用できますがgit filter-branch
、それは少し怖いです。)