Підрахуйте кількість комісій у гілці Git


184

Я вже знайшов цю відповідь: Кількість комірок на гілці в git, але це передбачає, що гілка створена від master.

Як я можу підрахувати кількість комітетів уздовж гілки, не покладаючись на це припущення?

У SVN це банально, але чомусь справді важко розібратися в git.


1
можливий дублікат Кількість
комітетів

Відповіді:


349

Для підрахунку комісій для галузі, на якій ви перебуваєте:

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

7
жоден із них не показує потрібне число, наприклад, master і ім'я гілки не показують однакову кількість комітів.
ботбот

Коментарі не дійсно дозволяють код, але це повинно показати, що він працює. ==== $ git init ==== $ touch test.txt ==== $ git додати. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list - master master => 1 ==== $ git check -b test ==== $ git rev-list - count test => 1 ==== $ git rev-list - count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git додати. ==== $ git commit -a ==== $ git rev-list - master master => 1 ==== $ git rev-list - count test => 2 ==== $ git rev-list - кількість голову ^ майстер => 1 ====
Пітер ван дер Лі

1
Я згоден з @botbot. Вони не дуже точні. Наприклад, спробуйте додати деякі об'єднання об'єднань або витягнути / перезавантажити і помітити, що підрахунки, як зображено вище, починають ставати ненадійними.
Віл Мур III

2
@wilmoore Ви маєте на увазі, що отримуєте додатковий рахунок після об'єднання гілки? Технічно це фіксація, і тому вона рахується. але якщо ви не хочете рахувати ці комісії, додайте --no-merges. Я оновлю відповідь.
Пітер ван дер Лі

2
rev-list - прапор кількості не існує в git 1.7. Зараз запропоновані до пекла пропозиції, які використовуються нижче git log, працюють краще, ніж будь-які інші пропозиції.
aaronbauman

60

Щоб побачити загальну кількість комісій, ви можете зробити так, як запропонував Петро вище

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

3
які ці цифри перед іменами? ти можеш пояснити ?
Ciasto piekarz

5
@Ciastopiekarz - це кількість комітетів кожної людини.
Аснад Атта

39

Може знадобитися відносно недавня версія Git, але це добре працює для мене:

git rev-list --count develop..HEAD

Це дає мені точний підрахунок комітетів у поточній гілці, що має свою базу для головного.

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

Моя історія фіксації лінійна для цієї гілки, тому YMMV, але це дає мені точну відповідь, яку я хотів, а саме: "Скільки комісій я до цього часу додав у цій гілці функції?".


Повинні бути однакові. У документах говорять так . A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
дозувальник

Я розгублений: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;не вишикується. ПОЧАТО так, як 1800, коли насправді нічого більшого, ніж злиття вгору / головний ~ 400, не призводить до змін. використання --no-mergesне набагато краще, дає приблизно 900. І якщо я зроблю такий злиття з ~ 800, а кількість рев-списків становить 1800, то я зливаюсь з ~ 790, я отримую від 6 до 28 нижчих рахунків у оборотах -ліст.
dlamblin

7

Скільки комісій було зроблено для поточного відділення з початку історії, не рахуючи комітетів із об'єднаних гілок:

git rev-list HEAD --count --first-parent

З документації git rev-list --help :

--first-parent

Виконайте лише перше батьківське зобов’язання, побачивши об'єднання. Цей параметр може дати кращий огляд під час перегляду еволюції певної тематичної гілки, тому що злиття у тематичну гілку, як правило, стосується лише пристосування до оновленого оновлення вгору за часом, і ця опція дозволяє ігнорувати окремі зобов’язання, внесені до ваша історія таким злиттям. Неможливо поєднати з --bisect.

Примітка: Дрібний клон зменшить розмір історії. Наприклад, якщо ви клонуєте --depth 1, повернете 1.

кількість комісій, виконаних після деяких інших зобов'язань:

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

Підрахунок комісій, здійснених з 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.
Довідка включена до самого сценарію.


git rev-list abc0923f .. --count - перший батько дає належні результати для моєї гілки, але перша команда дає велике значення
Jiss Raphel

5

Як щодо git log --pretty=oneline | wc -l

Це повинно рахувати всі комісії з точки зору вашої поточної галузі.


Який стовпець ви рахуєте? Це перший?
Хенджі

3

Мені подобається робити git shortlog -s -n --all. Надає список стилів "лідерів" імен та кількості комітетів.


2

Один із способів зробити це - список журналу для вашої гілки та підрахунок рядків.

git log <branch_name> --oneline | wc -l

1

Добре, що обрана відповідь не працює, якщо ви вимкнули вашу гілку з неспецифічної гілки (тобто, ні masterабо develop).

Тут я пропоную інший спосіб, яким я користуюся в pre-pushгачках для git.

# 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's 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

Для отримання додаткового аналізу відвідайте мій блог


1

В якості посилань на ОП Кількість комітетів на гілці в git, я хочу додати, що дані відповіді там також працюють з будь-якою іншою гілкою, принаймні з версії 2.17.1 git (і, здавалося б, надійніше, ніж відповідь Пітера ван дер дер):

працює правильно:

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

Остання команда дає нульові коміти, як очікувалося, оскільки я тільки що створив гілку. Команда раніше дає мені реальну кількість комітетів у моєму відділенні розвитку за вирахуванням злиття-здійснення

неправильно працює:

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

В обох випадках я отримую кількість усіх комісій у галузі розвитку та майстер, від якого гілки (опосередковано) сходять.


1

Якщо ви використовуєте систему UNIX, ви можете це зробити

git log|grep "Author"|wc -l

-2

Ви також можете зробити git log | grep фіксація | wc -l

і повернути результат


1
Це не є надійним. Наприклад, це буде відповідати комітетам, які "утримують" у повідомленні про виконання, наприклад, двічі.
rdb

@rdb Ні, це не буде. Він видасть лише кількість рядків, що містять слово "фіксувати", тому один рядок ніколи не буде рахуватися двічі.
iBug

@iBug: Ви пропускаєте суть. Якщо повідомлення про фіксацію містить слово "фіксувати", воно відображається в окремому рядку від рядка "фіксувати a1b2c ..." у git logвисновку, так що фіксація буде рахуватися двічі в результаті. Ще гірше, якщо повідомлення комісії повинно містити слово "вчинити" двічі в двох окремих рядках.
rdb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.