Я уже нашел этот ответ: Число фиксаций в ветке в git
но это предполагает, что ветвь была создана из мастера.
Как я могу подсчитать количество коммитов вдоль ветки, не полагаясь на это предположение?
В SVN это тривиально, но по какой-то причине действительно трудно понять в git.
Чтобы подсчитать фиксации для ветки, на которой вы находитесь:
git rev-list --count HEAD
для ветки
git rev-list --count <branch-name>
Если вы хотите считать коммиты на ветке, созданные с момента создания ветки
git rev-list --count HEAD ^<branch-name>
Это будет считаться со всеми фиксациями, когда-либо сделанными, которые также не относятся к имени ветки.
Примеры
git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master
Результат: 3
Если ваша ветка приходит из ветки с именем develop
:
git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop
Результат: 3
Игнорирование слияния
Если вы слияете другую ветку в текущую ветку без быстрой перемотки вперед, и вы делаете это выше, слияние также учитывается. Это связано с тем, что для git слияние является фиксацией.
Если вы не хотите считать эти коммиты, добавьте --no-merges
:
git rev-list --no-merges --count HEAD ^develop
Чтобы увидеть общее количество коммитов, вы можете сделать то, что Питер предложил выше
git rev-list --count HEAD
А если вы хотите увидеть количество коммитов, совершенных каждым человеком, попробуйте эту строку
git shortlog -s -n
будет генерировать вывод, как этот
135 Tom Preston-Werner
15 Jack Danger Canty
10 Chris Van Pelt
7 Mark Reid
6 remi
Для этого может потребоваться относительно новая версия Git, но это хорошо работает для меня:
git rev-list --count develop..HEAD
Это дает мне точное количество фиксаций в текущей ветке, имеющей базу на главном сервере.
Команда в ответ Peter, git rev-list --count HEAD ^develop
включает в себя еще много коммитов, 678 против 97 в моем текущем проекте.
Моя история фиксации линейна в этой ветки, поэтому YMMV, но она дает мне точный ответ, который я хотел, а именно: “Сколько коммитов я добавил до сих пор в этой ветки этой функции?”.
Сколько коммитов было сделано в текущей ветке с начала истории, не считая коммитов из объединенных ветвей:
git rev-list HEAD --count --first-parent
Из документации git rev-list –help:
--first-parent
Следите только за первым родительским коммитом, увидев коммит слияния. Эта опция может дать лучший обзор при просмотре эволюции конкретной ветки темы, потому что слияния с веткой темы имеют тенденцию только к адаптации к обновлению апстрима время от времени, и эта опция позволяет вам игнорировать отдельные коммиты, внесенные в Ваша история таким слиянием. Нельзя комбинировать с –bisect.
число коммитов, выполненных после другого коммита:
git rev-list HEAD abc0923f --count --first-parent
или то же самое:
git rev-list abc0923f.. --count --first-parent
или используйте любую другую ссылку на git:
git rev-list master tag-v20 --count --first-parent
Примечание: мелкий клон уменьшит размер истории. Например. если вы клонируете с --depth 1
, вернет 1.
Количество совершенных с 2018 года
git rev-list HEAD --count --first-parent --since=2018-01-01
01-01-2018, 01.01.2018, 2018.01.01 также работает.
git rev-label
Я написал скрипт для получения версии Git в формате, подобном '$refname-c$count-g$short$_dirty'
, который расширяется до master-c137-gabd32ef
.
Справка включена в сам скрипт.
установка
cd ~/bin
wget 'https://gitlab.com/kyb/build-info-header/raw/master/git-revision.sh?inline=false' -qO git-revision.sh && chmod +x git-revision.sh
ln -s $PWD/git-revision.sh /usr/local/bin/git-revision
usage
использования
git revision
git revision '$refname-c$count-g$short$_dirty'
Как насчет git log --pretty=oneline | wc -l
Это должно считать все коммиты с точки зрения вашей текущей ветки.
Мне нравится делать git shortlog -s -n --all
. Дает вам список имен и количество коммитов в стиле “таблица лидеров”.
Один из способов сделать это – перечислить журнал для вашей ветки и подсчитать строки.
git log <branch_name> --oneline | wc -l
Ну, выбранный ответ не работает, если вы отделили свою ветку от неспецифической ветки (т.е. не master
или develop
).
Здесь я предлагаю другой способ, который я использую в своих pre-push
git hooks.
# Run production build before push
echo "[INFO] run .git/hooks/pre-push"
echo "[INFO] Check if only one commit"
# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
gitLog=$(git log --graph --abbrev-commit --decorate --first-parent HEAD)
commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""
while read -r line; do
# if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
# that means it on our branch BRANCH_NAME
matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"
if [[ ! -z ${matchedCommitSubstring} ]];then
if [[ $line =~ $currentBranch ]];then
startCountCommit="true"
else
startCountCommit=""
if [[ -z ${baseBranch} ]];then
baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )
fi
fi
fi
if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
((commitCountOfCurrentBranch++))
fi
done <<< "$gitLog"
if [[ -z ${baseBranch} ]];then
baseBranch="origin/master"
else
baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )
fi
echo "[INFO] Current commit count of the branch ${currentBranch}: ${commitCountOfCurrentBranch}"
if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
exit 1
fi
Для более подробного анализа посетите мой блог
Поскольку OP ссылается на Количество коммитов на ветке в git, я хочу добавить, что данные ответы там также работают с любой другой веткой, по крайней мере, начиная с git версии 2.17.1 (и, по-видимому, более надежно, чем ответ от Питер ван дер Доус):
работает правильно:
git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0
Последняя команда дает нулевые коммиты, как и ожидалось, так как я только что создал ветку. Команда before дает мне реальное количество коммитов в моей ветке разработки минус коммит-слияния
не работает правильно:
git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361
В обоих случаях я получаю количество всех коммитов в ветке разработки и мастере, с которых ветки (косвенно) спускаются.
Вы также можете сделать git log | grep commit | wc -l
и получить результат назад