8

--dirtyオプションを発見したばかりでgit describe、非常に便利なことを行う必要があるように見えます。つまりgit describe、作業ツリーがダーティな場合の出力にサフィックスを追加しますが、私のリポジトリの一部ではそうではないようです:

$ git status
# On branch 8.30
nothing to commit (working directory clean)
$ git describe --dirty
8.30rel-8-g9c1cbdb-dirty

これは、作業ディレクトリがtag に対して相対的に汚れているためではないかと考えましたが、そうではないようです:

$ git status
# On branch 1.4
nothing to commit (working directory clean)
$ git describe --tags --dirty --long
1.4rel-0-gfedfe66-dirty

Mercurialを使っhg idていたときはよく使っていましたが、デフォルトの動作は、ダーティ リポジトリに対して報告されたコミット ハッシュにサフィックスを追加するという事実が気に入っていたので、それ以来、同等のものを探していましたが、そうではありませんでした。ドキュメントを考えると、私が期待することをしているように見えます:+gitgit describe --dirty

   --dirty[=<mark>]
       Describe the working tree. It means describe HEAD and appends
       <mark> (-dirty by default) if the working tree is dirty.

--dirtyをすべきか誤解していますか、それとも正しく使用していませんか?

違いが生じた場合に備えて、すべての git リポジトリはバックミンスター経由でデプロイされるため、関連するサブモジュールはなく、ファイルシステムはnfs共有です。


更新:回避策を発見しましたが、これがどのように違いを生んでいるのかまったくわかりません。

レポで実行するgit diff --quiet HEADと、突然、git describe期待どおりに動作します。

$ git status
# On branch 8.30
nothing to commit (working directory clean)
$ git describe --dirty
8.30rel-8-g9c1cbdb-dirty
$ git diff --quiet HEAD
$ git describe --dirty
8.30rel-8-g9c1cbdb

また、リポジトリをgit describe報告しているときに、 「ローカルのコミットされていない変更、インデックスにチェックインされていません」も表示され、作業ディレクトリに各ファイルがリストされていることを発見しましたが、それらに対する差分はなく、行だけです。dirtygitk---- filename ----


さらなる更新:これは引き続き問題であるため、最終的にgit-describe-dirtyスクリプトを作成しました。これは、実行することから始まりgit describe --dirtyますが、リポジトリが汚れていることが判明した場合は、git update-index -q --refresh再試行して 2 番目の結果を取得する前に実行されます。

何百ものリポジトリを反復処理する場合git describe-dirty、リポジトリがダーティであることを最初に示すリポジトリのインデックス更新のみを使用して実行すると、git update-index -q --refresh ; git describe --dirty毎回実行する場合に比べて大幅に時間を節約できます。

4

3 に答える 3

10

git 1.7.6 以前を実行している場合は、インデックスが古い可能性があるため、git update-index --refresh使用する前に実行する必要があります。「git diff」は磁器のコマンドであり、おそらくインデックス自体を更新するためgit describe --dirty、使用する回避策が機能します。git diff --quiet HEAD

git 1.7.7 でこれを修正する git commitでは、問題が説明されています。

git describe --dirty を実行すると、インデックスが更新されます。以前は、キャッシュされたインデックスにより、describe はインデックスがダーティであると考えてしまいましたが、実際にはインデックスが古くなっただけでした。

git statusインデックスを更新するため、説明した手順の正確な順序ではこの問題は発生しないことに注意してください。ただし、説明した回避策が一致するため、この同じ問題が発生していると思います。問題を示す方法は次のとおりです。

% git describe --tags --dirty
v1.0.0
% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git status
# On branch dev
nothing to commit (working directory clean)
% git describe --tags --dirty
v1.0.0

ここで「git status」を実行すると、回避策と同様に、副作用としてインデックスが更新され、「git describe」出力が修正されます。git 1.7.6 以前の適切な配管修正は次のようになります。

% touch pom.xml
% git describe --tags --dirty
v1.0.0-dirty
% git update-index --refresh
% git describe --tags --dirty
v1.0.0
于 2013-07-08T23:01:47.200 に答える