それとも、2 つの日付の間に発生したすべてのコミットだけですか? SVNでは、次のようなことができます
svn diff -r{date}:{date}
それをするために!これに相当するGitが見つからないようです。
具体的には、その日に誰がコミットしたすべてのコードを含む毎日の電子メールを送信するスクリプトを作成することを考えています。
前の提案にはいくつかの欠点があります。基本的に、私はに相当するものを探していましたcvs diff -D"1 day ago" -D"2010-02-29 11:11"
。どんどん情報を集めているうちに、解決策が見つかりました。
私が試したこと:
git whatchanged --since="1 day ago" -p
ここから
ただし、これにより、1 つのファイルに複数のコミットがある場合でも、各コミットの差分が得られます。「日付」は git では少し緩い概念であることは知っていますが、これを行うには何らかの方法があるに違いないと思いました。
git diff 'master@{1 day ago}..master
いくつかの警告warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
が表示され、すべての差分が表示されるわけではありません。
git format-patch --since=yesterday --stdout
私には何も与えません。
revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
何とか動作しますが、複雑に見え、現在のブランチに限定されません。
ついに:
git diff $(git rev-list -n1 --before="1 day ago" master)
私が思っていたよりも複雑ですが、うまくいくようで、同様のことを行うデフォルトの方法です。おかしなことに、git-cvsserver は "cvs diff -D" をサポートしていません (どこかに文書化されていなければ)。
「日付」は、git では少しあいまいな概念です。コミットには、誰かが実際にコミットをリポジトリにプル/コミットする前のかなり前の作成日が含まれる場合があります。また、コミットはリベースされ、明らかに新しいコミットの上になるように更新される場合があります。
コミットには、コミットが何らかの方法でリベースまたは修正された場合に更新されるコミット日付もあります。これらのコミットは、ある種の時系列順である可能性が高くなりますが、コミッターが自分のコンピューターに正しい時刻を設定している場合でも、変更されていないコミットがリモート リポジトリの機能ブランチに無期限に置かれる可能性があります。中央リポジトリのマスター ブランチにマージされます。
あなたの目的にとっておそらく最も役立つのは、問題の特定のリポジトリの reflog 日付です。ブランチごとの reflog を有効にしている場合 (「 」を参照git config core.logAllRefUpdates
)、ref@{date}
構文を使用して、特定の時点でのブランチの場所を参照できます。
例えば
git log -p master@{2009-07-01}..master@{now}
次のような「あいまいな」説明を使用することもできます。
git log -p "master@{1 month ago}..master@{yesterday}"
これらのコマンドは、リポジトリの特定のブランチに「出現」したすべてのコミットを、作成者とコミットの日付に従って実際に「古い」かどうかに関係なく表示します。
ブランチごとの reflog はリポジトリに固有であるため、クローンで log コマンドを実行していて、(たとえば) 1 か月プルしない場合は、先月のすべての変更を一度にプルすることに注意してください。その後、先月のすべての変更が@{1 hour ago}..@{now}
範囲内に表示されます。人々がプッシュする「中央」リポジトリでログコマンドを実行できる場合、それはあなたが望むことをするかもしれません。
多分
$ git format-patch --committer=<who> --since=yesterday --stdout
あなたが望むものですか(「--stdout」の有無にかかわらず)?
特定の日付以降のすべての変更の差分を取得できるもう 1 つの簡単な方法は、X
その日付以降に発生した最初のコミットを見つけてから使用することです。
git diff X
これには、新しいクローンの reflog エントリに依存しないという利点があります。
git diff <reference>@{n}..
git log <reference>@{n}..
でのソリューション
一般的な解決策は次を使用することだと思います:
git rev-list -n1 --first-parent --until=<a date string> <a ref>
--first-parent を指定しないと、後でマージされa ref
たが の時点ではマージされていないブランチからコミットを取得する可能性がありa date string
ます。
の代わりに--children
andを使用する別の方法を次に示します。grep
-n1
mlm_git_ref_as_of() {
# # Examples #
#
# Show all commits between two dates:
#
# git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
#
# Show diffs of all commits between two dates:
#
# git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
local as_of="$1"
local ref="${2:-HEAD}"
# Get the most recent commit (--children, grep -v ' ') that was on
# the given branch ($ref, --first-parent) as of a given date
# ($as_of)
git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}
私はgit whatchanged
この Q&A を読む前はよく知りませんでしたが、非常に異なる結果が得られたので、何をしているのかわかりません。
git-format-patchを使用してパッチ (差分) を準備し、電子メールで送信することもできます。
オプション [since] または [revision range] を使用してコミット範囲を指定します。
より良い方法がある可能性が高いため、これはもっと面白い答えです。これにより、今日のすべてのコミット ハッシュが表示されます。
git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`
;·)
私はそれを行う方法をスローします:
git log
日付は、現在のブランチのコミット ハッシュを提供します。次にgit diff 8fgdfg8..565k4l5
、ファイルごとに集計された適切な違いが得られるようなものを使用します。これが役立つことを願っていますが、あまりテストされていません