0

私はgitを使用して、昨年の毎月の最初のコミットに同期しようとしています。月の最初の日、月の最初の2日に、月ごとに戻ることができるようにしたいと思います。または、少なくとも一定の「秒」値から。これまでのところ私はこれを持っています:

$(git rev-list --before "$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01" -n 01 HEAD)

これには明らかに定数秒の値は含まれていません。現状では、このスクリプトを実行してから1時間後に再度実行すると、スクリプトを実行した正確な時刻からxか月前に戻っているため、2つの異なるsha1が返されます。このスクリプトをいつ実行しても、返されるsha1は同じである必要があります。それは理にかなっていますか?何か案は?

4

1 に答える 1

0

まず、コマンドにタイプミスがあります。でなければなりません。--before="$(...がありません=

の動作はdateここでは問題ではありません。date +%Y-%m-01文字列のようなものを返します2011-10-01。追加の時間情報は含まれていません。したがって、2 番目の date 呼び出しでは$i、月数だけ減少し、次のような形式の文字列も返されます2011-09-01git-rev-listその文字列以外に、追加情報は引数の値として渡されません--before=

の使用を検討する必要があることがいくつかありますgit-rev-list

  1. 使用するときは、常に現在のブランチHEADを参照しています。たとえば、取得したコミット ID の 1 つをチェックアウトすると、HEAD が変更されます。代わりにまたは他のブランチ名を参照として使用することをお勧めします。master
  2. Git にはコミットの一時的な順序はありません。9 月 1 日のコミットの後に、階層的に 8 月 1 日に作成されたコミットを持つことができます。コミッター フィールドのタイムスタンプに依存するため、--beforeまたは引数を使用すると、出力が混乱する結果になります。--after
  3. コミッター フィールドのタイムスタンプも誤解を招く可能性があります。ブランチに直線的な履歴がない場合、コミットが履歴のある時点でリポジトリ内のブランチの一部であったかどうかを判断するのは困難です。作成者は、コミットを行ってから X か月後に自分のブランチをプッシュ/マージした可能性があるため、他のユーザーには表示されていません。

上記のすべてを考慮すると、次のコマンドが機能します。

$(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)

これは、指定された月の最初の後の最初のコミットの ID を返します。(このコミットは必ずしもその月に行われたとは限りません。とにかくその月にコミットがなかった可能性があります。)

于 2011-10-21T14:05:01.783 に答える