Подсчитайте количество коммитов на ветке Git

Вопрос:Я уже нашел этот ответ: Число фиксаций в ветке в git но это предполагает, что ветвь была создана из мастера. Как я могу подсчитать количество коммитов вдоль ветки, не полагаясь на это предположение? В SVN это тривиально, но по какой-то причине действительно трудно понять в git. Лучший ответ: Чтобы подсчитать фиксации для ветки, на которой

Вопрос:

Я уже нашел этот ответ: Число фиксаций в ветке в git
но это предполагает, что ветвь была создана из мастера.

Как я могу подсчитать количество коммитов вдоль ветки, не полагаясь на это предположение?

В SVN это тривиально, но по какой-то причине действительно трудно понять в git.

Лучший ответ:

Чтобы подсчитать фиксации для ветки, на которой вы находитесь:

git rev-list —count HEAD

для ветки

git rev-list —count <branch-name>

Если вы хотите считать коммиты на ветке, созданные с момента создания ветки

git rev-list —count HEAD ^<branch-name>

Это будет считаться со всеми фиксациями, когда-либо сделанными, которые также не относятся к имени ветки.

Содержание

  1. Примеры
  2. Игнорирование слияния
  3. Сколько коммитов было сделано в текущей ветке с начала истории, не считая коммитов из объединенных ветвей:
  4. число коммитов, выполненных после другого коммита:
  5. Количество совершенных с 2018 года
  6. git rev-label
  7. установка
  8. usage

Примеры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 Ответ №1

Чтобы увидеть общее количество коммитов, вы можете сделать то, что Питер предложил выше

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 Ответ №2

Для этого может потребоваться относительно новая версия Git, но это хорошо работает для меня:

git rev-list —count develop..HEAD

Это дает мне точное количество фиксаций в текущей ветке, имеющей базу на главном сервере.

Команда в ответ Peter, git rev-list —count HEAD ^develop включает в себя еще много коммитов, 678 против 97 в моем текущем проекте.

Моя история фиксации линейна в этой ветки, поэтому YMMV, но она дает мне точный ответ, который я хотел, а именно: “Сколько коммитов я добавил до сих пор в этой ветки этой функции?”.

Ответ №3

Сколько коммитов было сделано в текущей ветке с начала истории, не считая коммитов из объединенных ветвей:

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’ Ответ №4

Как насчет git log —pretty=oneline | wc -l

Это должно считать все коммиты с точки зрения вашей текущей ветки.

Ответ №5

Мне нравится делать git shortlog -s -n —all. Дает вам список имен и количество коммитов в стиле “таблица лидеров”.

Ответ №6

Один из способов сделать это – перечислить журнал для вашей ветки и подсчитать строки.

git log <branch_name> —oneline | wc -l Ответ №7

Ну, выбранный ответ не работает, если вы отделили свою ветку от неспецифической ветки (т.е. не 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

Для более подробного анализа посетите мой блог

Ответ №8

Поскольку 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

В обоих случаях я получаю количество всех коммитов в ветке разработки и мастере, с которых ветки (косвенно) спускаются.

Ответ №9

Вы также можете сделать   git log | grep commit | wc -l

и получить результат назад

Оцените статью
Добавить комментарий