Ответ 1
Вы можете использовать git whatchanged --since="1 day ago" -p
Он также принимает аргумент --until
.
Или только все фиксации, которые произошли между двумя датами? В SVN вы можете сделать что-то вроде
svn diff -r{date}:{date}
сделать это! Кажется, я не могу найти эквивалент Git.
В частности, я ищу письмо script для отправки ежедневных писем со всем кодом, совершенным в тот день и кем.
Вы можете использовать git whatchanged --since="1 day ago" -p
Он также принимает аргумент --until
.
Предыдущие предложения имеют некоторые недостатки. По сути, я искал что-то эквивалентное cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. Собирая все больше и больше информации, я нашел решение.
Вещи, которые я пробовал:
git whatchanged --since="1 day ago" -p
из здесь
Но это дает разницу для каждого коммита, даже если в одном файле несколько коммитов. Я знаю, что "date" - это немного не совсем понятное понятие в git, я подумал, что должен быть какой-то способ сделать это.
git diff '[email protected]{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 в конкретном репозитории. Если вы включили блокировки для каждой ветки (см. git config core.logAllRefUpdates
), вы можете использовать синтаксис [email protected]{date}
, чтобы ссылаться на то, где была ветка в определенное время.
например.
git log -p [email protected]{2009-07-01}[email protected]{now}
Вы также можете использовать "нечеткие" описания, например:
git log -p "[email protected]{1 month ago}[email protected]{yesterday}"
Эти команды будут отображать все коммиты, которые "появились" в данной ветке репозитория, независимо от того, как они "старые" на самом деле соответствуют их дате и дате фиксации.
Обратите внимание, что рефлектор для каждой ветки специфичен для репозитория, поэтому, если вы выполняете команду журнала на клоне, и вы не тянете за (скажем) месяц, то вытащите все изменения за последний месяц сразу же, все изменения последнего месяца появятся в диапазоне @{1 hour ago}[email protected]{now}
. Если вы можете запустить команду журнала на "центральной" репозитории, которую люди нажимают, тогда она может делать то, что вы хотите.
git diff --stat @{2013-11-01}[email protected]{2013-11-30}
или
git diff --stat @{2.weeks.ago}[email protected]{last.week}
Может
$ git format-patch --committer=<who> --since=yesterday --stdout
- это то, что вы хотите (с или без '--stdout')?
Я считаю, что общее решение заключается в использовании:
git rev-list -n1 --first-parent --until=<a date string> <a ref>
Без - first-parent, вы можете получить фиксацию из ветки, которая позже была объединена с a ref
, но не была объединена с a date string
.
Здесь альтернатива, использующая --children
и 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, но для меня это дает разные результаты, поэтому я не уверен, что он делает.
Еще один простой способ, которым вы можете получить разницу всех изменений с определенной даты, - это просто найти первый commit X
, который произошел после или после этой даты, затем используйте
git diff X
Это имеет то преимущество, что оно не зависит от записей reflog в новом клоне, в отличие от
git diff <reference>@{n}..
git log <reference>@{n}..
решений в
Это более смешной ответ, потому что, вероятно, лучший способ. Это покажет все хеши фиксации на сегодняшний день.
git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`
; & Мидот;)
Вы также можете использовать git-format-patch для подготовки патчей (разностей) и отправки их по электронной почте.
Используйте опции [с] или [диапазон изменения], чтобы указать диапазон коммитов.
Я брошу так, как я это сделаю:
git log
для даты дает хеши для текущей ветки. Затем я просто использую что-то вроде git diff 8fgdfg8..565k4l5
, которое дает мне правильную разницу, агрегированную файлами. Надеюсь, что это поможет, не испытал много, хотя
Чтобы отслеживать изменения файлов от даты к дате в вашей ветке,используйте следующую формулу:
Пример:
git checkout <branch>
git pull
git diff --stat @{fromDate}[email protected]{toDate}
Обратите внимание, что даты указаны в формате ГГГГ-ММ-ДД :
git diff --stat @{2019-08-20}[email protected]{2019-08-21}
Если вы хотите наблюдать изменения в определенном файле за определенный промежуток времени (посмотреть разницу в коде), просто перейдите к текущему файлу:
Пример:
git diff @{2019-01-01}[email protected]{2019-01-02} ~/dev/myApp/package.json