11

マージが必要なときに、ファイルに入れる行の最後に LF だけでなく CRLF を使用するように Git に依頼することは可能ですか?

LF を使用したマージ

EOL 文字が表示されていないテキスト エディターで競合を解決する場合、選択して削除すると、誤ってこれらの LF がマージされてしまう可能性があります。

選択して削除

あなたに残します:

LFがファイルに忍び込みます!

そして今、2 つの LF があなたの CRLF ファイルに忍び込みました!

明らかに、マージを解決するときに行末にもっと注意を払うことも1つの選択肢ですが、ここで生成する行にCRLFを使用するようにGitに指示する方法があるかどうかを尋ねたいと思いました.

4

3 に答える 3

11

マージが必要なときに、ファイルに入れる行の最後に LF だけでなく CRLF を使用するように Git に依頼することは可能ですか?

それは... git 2.7.2+(2016年2月)から実際に可能です。
そして、何もする必要はありません。

commit 15980decommit 86efa21 (2016 年 1 月 27 日) by Johannes Schindelin ( dscho)を参照してください。
( 2016 年 2 月 17 日のcommit ab2c107Junio C Hamanoによってマージされました)gitster

merge-file: コンフリクト マーカーをコンテキストの行末スタイルに一致させる

CR/LF の行末を持つファイルをマージする場合、出力ファイルに行末が混在しないように、競合マーカーはそれらと一致する必要があります

これは、一部の編集者が行末が混在していて本当に混乱するWindows で特に興味深いもの です。

Beat Bolli によるこのパッチのオリジナル バージョンは尊重さcore.eolれ、この開発者によるその後の改良も尊重されgitattributesました。
ただし、このアプローチは最適でgit merge-fileはありませんでした。GNU マージのドロップイン代替として発明されたものであり、リポジトリの外で操作してもまったく問題ありません!

元のアプローチのもう 1 つの問題が Junio Hamano によって指摘されました。レガシー リポジトリは、CR/LF 行末を使用してコミットされたテキスト ファイルを持っている可能性があります (そしてcore.eolgitattributesそこに誤った印象を与えます)。したがって、はるかに優れたアプローチは、コンテキストの行末があれば単純に一致させることです。

実際には、コンテキスト全体を見る必要はまったくありません。

  • ファイルがすべて LF のみの場合、またはすべてのファイルに CR/LF の行末がある場合、そのスタイルに一致するには1行だけを調べるだけで十分です。
  • また、行末が混在している場合でも、単一の行の eol を模倣しても問題ありません。混在する行末の山に追加するだけで、それについては何もできません。

つまり、競合の前の行を見て、それが最後の行で行末がない場合はその前の行にフォールバックし、最初のポストイメージの最初の行にフォールバックします。次に 2 番目のポスト イメージ、最後にプリ イメージです。
一貫した CR/LF (または未定) の行末スタイルが見つかった場合は、それを一致させます。それ以外の場合は、競合マーカーに LF のみの行末を使用します。

確認できる行が少なくとも 2 行ある必要があるのは事実ですが (そうしないと競合は発生しません)、行末については同じではありません問題の 3 つのファイルはすべて、任意の行末、それぞれ。この場合、LF のみの使用にフォールバックします。

于 2016-02-18T07:06:49.280 に答える