3

ファイルが特定のディレクトリに追加された場合、.gitattributes正確に次の内容になります。

*.txt    text

新しいファイルまたは以前に正規化されたファイル(たとえば、すべての LF 行末) がそのディレクトリにコミットされ、正規化されない可能性がある方法はありますか? つまり、モードを指定して有効にした後、新しい CRLF 行末をリポジトリに導入できる方法はありますか?.gitattributestext

言い換えると、この.gitattributesファイルは、新しい CRLF 行がファイルを含むディレクトリ内のファイルにコミットされるのを防ぐ絶対に確実な方法ですか? 私は、ファイルが完全に十分であり、CRLF を除外するためのさらなる手段 (サーバー側のフックなど) が不要であることを同僚に納得させたいと考えています。*.txt.gitattributes.gitattributes

回答は、によって指定された行末動作をオーバーライドすることは不可能であることを確認するか、ファイルを回避していくつかの CRLF 行末に忍び込む.gitattributes方法を説明する反例を提供する必要があります。.gitattributes

4

2 に答える 2

2

ネガティブパターンは禁止されているgitattributesため、簡単には通過できません。

実際には、今日 (2013 年 3 月)非致命的なMake!pattern.gitattributesに提案されているパッチがあります。

そのため、 CRLF が不要であることがわかっているサブディレクトリに存在するファイル*.txtのみに、グローバル ルールを配置する必要があります。.gitattributes

また、コンテンツが混在するディレクトリに存在する、よりきめ細かいtextルールを予約します。.gitattributes


kostmoは、コメントEGit バグ 421364について言及しています。

これが実装されるまでは、次のセットアップをお勧めします。

  1. 各 Eclipse プロジェクトについて、 に移動し、「 」を にProperties > Resource変更します。結果のファイルをコミットします。New text file line delimiterOther: Unix.settings/org.eclipse.core.runtime.prefs
  2. Git に対してany.gitattributesまたは " " を構成しないでください。 これは、作業ディレクトリとリポジトリのファイルの行末が同じであることを意味します。Git と EGit はファイルの内容を変換しません。core.autocrlf

1. では、Eclipse で作成されたすべての新しいファイルはLF、Windows のユーザーによって作成された場合でも、正しい ( ) 行末になります。

を使用してリポジトリに既にあるファイルについてはCRLF、それらを修正して結果をコミットできます。コマンドラインでdos2unixorを使用することをお勧めします。fromdos

注: この問題 (バグ 421364 ) は、 Lars Vogelによってバグ 342372の複製として再認定されました (2014 年 3 月 25 日) 。

したがって、.gitattributesJGitによるサポートは「割り当て」ですが、その実装はまだ進行中.

実装はレビュー中です (2015 年 1 月):

.gitattributesWorkingTreeIterator および dirCacheIterator での属性の読み取りのサポートを含む、ファイルを解析および処理するためのコア クラス。

getAttributesツリー ウォークにフィーチャを追加します。との両方が
必要なため、属性の計算は で行う必要があります。TreeWalkWorkingTreeIteratorDirCacheIterator


2018 年 8 月の更新: 上記のバグ (バグ 342372 ) は、解決されたばかりのJGit バグ 537410に依存しています。
JGit のリベースとスタッシュは行末s を保持しません」

問題は、ファイルのResolveMergerduringが(JGit がフィルターと eol 属性を格納する) をprocessEntry()記憶せず、属性やフィルターを無視してそれらをチェックアウトすることです。CheckoutMetadatacheckout()

ResolveMerger.cleanUp()同じ問題があります。

JGit コミット 4027c5c (レビュー 127290から) はそれを修正する必要があります。
JGitの積極的な貢献者であるThomas Wolfに感謝します。

それはEGitに希望を与えます:

EGit は一般に、ステージング/マージ/チェックアウトでのすべての eol 処理を JGit に任せます。
EGit がそれを考慮しなければならない唯一の場所は、インデックス エントリ自体を読み取らなければならない場合の比較フレームワークであり、そこでは既に適切に処理されていますCheckoutMetadata

于 2013-06-18T07:01:45.130 に答える
1

もう一度言い換えると、この .gitattributes ファイルは絶対に簡単な方法ですか

いいえ。Git には、通常のタスクを簡単にし、疑わしい問題を解決するための便利な機能がたくさんありますが、それによって自分のリポジトリの制御が制限されることはありません。

.gitattributes ファイルで十分であり、CRLF を除外するための追加の手段 (サーバー側のフックなど) は不要であることを同僚に納得させたいと思います。

それらは必要です。自分のリポジトリで他の人が何をするかは、誰も制御できません。

git update-index --cacheinfo \
        100644,`git hash-object -w --no-filters path/to/file`,path/to/file

git hash-object ドキュメントから

--no-filters
内容をそのままハッシュし、行末変換を含め、属性メカニズムによって選択された入力フィルターを無視します。ファイルが標準入力から読み取られる場合、 --path オプションが指定されていない限り、これは常に暗示されます。

于 2015-01-09T01:56:17.787 に答える