2017-06-01 11 views
5

私はいくつかの生成されたが、強く必要なライブラリファイルを生成するIDEで作業しています。ですから、ライブラリを複数のバージョンで使用したい場合や、実際には意味のない変更の負荷がある場合は問題があります。git filterは 'unmodifying'ファイルではありません

概要:私はgitののフィルタが正しいアプローチされていると思った1つのまたは複数のファイルの単一行を無視します。私はgrepを読むことができるかもしれないので、問題なく関連する行のためにできる。

私はgitフィルタをセットアップして、ヘッダーファイル内のバージョンの変更を元に戻しました。 (このファイルに関連するさまざまな変更がある場合がございますのでご了承ください。)

[filter "ignore-version"] 
    smudge = cat %f || cat 
    clean = git ls-files %f --error-unmatch >&- 2>&- \ 
       && sed \"/version/c $(git show HEAD:%f | grep version)\" || cat 

(私はより良い読書のために改行をエスケープし、簡単にするために一致する単語を変え追加しました。元のバージョンでは衝突がありません可能。)ファイルはリポジトリ内にすでにある場合

  1. git ls-filesチェック(現在HEAD

1.1存在する場合、sedは先に行くしかないだろう1

1.2ではない場合、catを追跡し、既にして行全体を置き換えるために汚い仕事をしますので、

(これは、失われた取得することはありません、まだ追跡されていないファイルを確認する必要があります)遠く、それは動作します。

問題(私は...フィルタは黙っすべてCRLF LFに変換しているという事実と一緒に暮らすことができます):gitのによって変更された固定ファイルがマークされ、リポジトリの最新のファイルが、フィルタリングされたバージョンは2進数である。別のツールとしてkdiffを使ってこれをチェックしました。


編集1

$ git show HEAD:file.txt | md5sum 
9f95c28cebe4f45b8efb7b0ae64dfa56 
$ cat file.txt | md5sum 
894e7d1b28180b7a193bf3cdd6ceaacb 
$ cat file.txt | git ls-files file.txt --error-unmatch >&- 2>&- \ 
       && sed \"/version/c $(git show HEAD:file.txt | grep version)\" 
       || cat | md5sum 
9f95c28cebe4f45b8efb7b0ae64dfa56 

編集2:ここでは、2つのファイルバージョンの平等を示すいくつかの出力でさらに、差の出力が..

$ git diff file.txt 
warning: LF will be replaced by CRLF in file.txt. 
The file will have its original line endings in your working directory. 

ご注意くださいこのファイルのチェックインされたバージョンには、前回のコミットと同じようにLFが含まれています。また、core.autocrlfの設定は、.gitattributesファイルのフィルタ指定以外の何もせずに、真のです。

+0

これをLinuxマシンで、ゼロからリポジトリを使って再現しました。同じコマンドがそれを行います!だから、明らかに、Windowsマシン上でのgitと改行の使用に問題があります。私はすべてのgitの設定を試みましたが、誰も動作しませんでした。 – maxik

+0

https://stackoverflow.com/questions/17628305/windows-git-warning-lf-will-be-replaced-by-crlf-is-that-warning-tail-backwar – Gimby

+0

@Gimbyこの警告に従っていたはずですリンクの背後にある説明は解決策ではありませんでしたが、正しいと思いました。とにかくありがとう。 – maxik

答えて

4

最後に、私はそれを解決しました。問題のファイルは奇妙な状態でしたが、チェックアウトされたバージョンにはgitの設定(チェックアウトウィンドウスタイル、コミットUNIXスタイル)に関して正しくないUNIXスタイルの行末があったようです。ステージングこの特定のファイルの後に、それは言及なしでステージングエリアから即座に削除され、現在は変更されていないとみなされます。だから、gitはステージング中に作業ディレクトリファイルを消去したと思います(行末)。

申し訳ありません。 completly問題をチェックするために


ステップ:

git init 
echo "version=0.1" > file.txt 
echo "*.txt filter=ignore-version" > .gitattributes 
git config --local filter.ignore-version.clean 'git ls-files %f --error-unmatch >&- 2>&- \ 
    && sed -b "/version/c $(git show HEAD:%f | grep version)" || cat' 
git config --local filter.ignore-version.smudge 'cat %f || cat' 
git add file.txt .gitattributes 
git commit -m "initial commit" 
# ----- 
echo "version=0.2" > file.txt 
git status 

ステータス変更を報告してはいけません。 LinuxとWindowsの両方で裸のリポジトリを使用して私のために働いていました。

関連する問題