「text」属性を使用してファイルを正規化した後、gitに強制的にマスターブランチをチェックアウトさせ、改行を削除させるにはどうすればよいですか?


101

さて、私は.gitattributesこのような行でファイルを追加しました

*.css text
*.js text
etc...

次に、http://git-scm.com/docs/gitattributes#_checking-out_and_checking-inの指示に従いました

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

しかし、今では私の作業用コピーにはまだキャリッジリターンがあります。保持したい追跡されていないファイルがあります。正規化されたファイルでマスターブランチをgitチェックアウトするにはどうすればよいですか?

リポジトリ内でファイルが正規化されていることを知っています。リポジトリを複製すると、キャリッジリターンなしですべてのファイルが得られるからです。

回答:


264

ああああ!以前のコミットをチェックアウトしてから、マスターをチェックアウトします。

git checkout HEAD^
git checkout -f master

5
この回避策に感謝しますが、「checkout -f」が実際に再チェックアウトを強制しないことがgitの明白な問題です。別の方法としては、最初にすべての作業用コピーファイル(つまり、.git dirを除くすべて)を削除します。
pfalcon 2014年

ああ、はい、ありがとうございます。それを聞いて、興味のあるファイルを削除してチェックアウトを実行できると思います。私にとって、修正しようとしたファイルは1つだけでした。しかしもちろん、それはすべてのファイル、数百、数千の場合もあります。
Jason

これはgit 1.8.3(mac)では次のエラーで失敗します:エラー:pathspec 'HEAD ^'はgitが認識しているファイルと一致しませんでした。
dval

@dval、この投稿の編集を確認すると、これを行う別の方法が表示されます。私もMacで実行していますが、これでうまくいきました。また、gitを2+にアップグレードすることをお勧めします。Homebrewを使用して、安全で保守可能な方法でこれを行うことができます。
Jason

2
これは実際には機能しません。GITは、2つのコミット間で変更されたファイルのみを更新します(一部の例外はあります)。リポジトリが真新しい場合。たった2つのコミットと最初のコミットが空の場合、このソリューションは機能します。それ以外の場合は、メクシンの回答で説明されているように、すべてのファイルを強制的に削除する必要があります。
jstine 2018年

16

他の人が指摘したように、リポジトリ内のすべてのファイルを削除してからチェックアウトすることができます。私はこの方法を好み、それは以下のコードで行うことができます

git ls-files -z | xargs -0 rm
git checkout -- .

または一行

git ls-files -z | xargs -0 rm ; git checkout -- .

私はいつもそれを使っており、まだどんな欠点も見つけていません!

さらにいくつかの説明については、-zにより、各エントリの出力の最後にヌル文字を追加ls-filesし、-0伝えるxargsことは、これらのヌル文字で受信された出力を区切るために。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.