まず、コマンドにタイプミスがあります。でなければなりません。--before="$(...がありません=。
の動作はdateここでは問題ではありません。date +%Y-%m-01文字列のようなものを返します2011-10-01。追加の時間情報は含まれていません。したがって、2 番目の date 呼び出しでは$i、月数だけ減少し、次のような形式の文字列も返されます2011-09-01。git-rev-listその文字列以外に、追加情報は引数の値として渡されません--before=。
の使用を検討する必要があることがいくつかありますgit-rev-list。
- 使用するときは、常に現在のブランチ
HEADを参照しています。たとえば、取得したコミット ID の 1 つをチェックアウトすると、HEAD が変更されます。代わりにまたは他のブランチ名を参照として使用することをお勧めします。master
- Git にはコミットの一時的な順序はありません。9 月 1 日のコミットの後に、階層的に 8 月 1 日に作成されたコミットを持つことができます。コミッター フィールドのタイムスタンプに依存するため、
--beforeまたは引数を使用すると、出力が混乱する結果になります。--after
- コミッター フィールドのタイムスタンプも誤解を招く可能性があります。ブランチに直線的な履歴がない場合、コミットが履歴のある時点でリポジトリ内のブランチの一部であったかどうかを判断するのは困難です。作成者は、コミットを行ってから X か月後に自分のブランチをプッシュ/マージした可能性があるため、他のユーザーには表示されていません。
上記のすべてを考慮すると、次のコマンドが機能します。
$(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)
これは、指定された月の最初の後の最初のコミットの ID を返します。(このコミットは必ずしもその月に行われたとは限りません。とにかくその月にコミットがなかった可能性があります。)