Як я можу отримати рахунок підрахунку Git?


753

Я хотів би отримати кількість комітетів мого сховища Git, схоже на номери версій SVN.

Мета - використовувати його як унікальний, збільшуючий номер збірки.

Я в даний час так роблю на Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Але я відчуваю, що це трохи хак.

Чи є кращий спосіб зробити це? Було б здорово, якби мені насправді не потрібен wcабо навіть Git, тож він міг би працювати на голій Windows. Просто прочитайте файл або структуру каталогу ...


1
Тут ви можете знайти цікаві відповіді: що таке еквівалент git для номера редакції?
Себастьєн Варрет

190
git rev-list HEAD --count git rev-list
Джейк Бергер

14
@jberger: Я думаю, що ваш коментар повинен бути перетворений на відповідь.
utapyngo

@utapyngo: давши 13 інших відповідей, я знав, що його поховають. Я його тоді розмістив тут .
Джейк Бергер

@jberger, ця відповідь не працює для git1.7.0.
Vorac

Відповіді:


1160

Щоб отримати Комміт кількості для перегляду ( HEAD, master, Комміт хеш):

git rev-list --count <revision>

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

git rev-list --all --count

Я рекомендую не використовувати це для ідентифікатора збірки, але якщо потрібно, можливо, найкраще використовувати підрахунок для тієї гілки, на якій ви будуєте. Таким чином, одна і та ж редакція завжди матиме однакову кількість. Якщо використовувати підрахунок для всіх гілок, активність на інших гілках може змінити кількість.


27
git shortlog | grep -E '^[ ]+\w+' | wc -lякщо ви хочете отримати загальну кількість і git shortlog | grep -E '^[^ ]'якщо ви хочете отримати номер комісії для кожного учасника.
skalee

2
Дякуємо, що вказали wc -l. Мінімалізм FTW. Я включив це у свою відповідь.
Бенджамін Аткін

17
Це рішення є однозначним (подібний до git log --pretty=format:'' | wc -lпідходу, наведеного в оригінальному запитанні) і невірним: це можна побачити, перевернувши відповідність ( git shortlog | grep -Ev '^[ ]+\w+') і побачивши, що, наприклад, комісії без повідомлення (тобто, <<>> ") не зараховуються. Використання git rev-list HEAD --countє і більш лаконічним, і більш точним.
ctrueden

17
@BenAtkin: Мої вибачення; це був не мій намір бути образливим, а лише фактичним. Точка, взята щодо дати відповіді. На той час ваше рішення, можливо, було найкращим із доступних. Але я відстоюю свою заяву, що git rev-list HEAD --countзараз є кращим рішенням.
ctrueden

3
Додано також відповідь і працює також зі старими версіями:git log --oneline | wc -l
Джиммі Кейн

155

git shortlog є одним із способів.


5
Тай. Це працювало для мене під час підрахунку комірок у діапазоні; git shortlog sha1..sha2
RJFalconer

1
Так, перший рядок журналу git містить кількість комісій у ньому. Проблема вирішена.
Роберт Массайолі

5
Кількість комітетів групується за комітетом, не дуже добре. Можна рахувати рядки в короткому журналі git, але це чомусь не працює над ssh без терміналу (пейджер?). Оригінальне рішення запитувача - найкраще! git log --pretty = формат: '' | wc -l
Сем Уоткінс

4
Однак я б запропонував, git rev-list HEAD --countа не оригінальний підхід, наведений в ОП. У моїх тестах, git log --pretty=format:'' | wc -lвимикається один.
ctrueden

3
@ctrueden git log --oneline | wc -lне вимикається одним (OS X 10.8.5).
Енді Стюарт

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Перелічіть комітети, до яких можна дістатися, дотримуючись батьківських посилань із заданої комісії (у цьому випадку HEAD ).

--count : Надрукуйте число, вказавши, скільки комісій було б у списку, і пригнічіть усі інші результати.


101

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

git shortlog -s

Вихід:

14 John lennon
9  Janis Joplin

Можливо, ви хочете знати, що -sаргумент є формою стиснення --summary.


11
git shortlogсам по собі не стосується початкового питання про загальну кількість комітетів (не групується за автором). Використовуйте git rev-list HEAD --countзамість цього.
ctrueden

5
Дивовижно! Ви можете впорядкувати його | sort -nтеж
Мохсен

54

Якщо ви шукаєте унікальний і все ще досить читабельний ідентифікатор для комітетів, опис git може бути лише для вас.


2
Це могло б працювати і було б простішим у використанні, ніж альго на замовлення. +1
VonC

2
Я не знав опису git. Це невелике число між назвою тегу та sha1 - це саме те, що я шукав. Дякую.
Splo

2
Погляньте на скрипт GIT-VERSION-GEN і як він використовується в репозиторії git та подібний скрипт у джерелах ядра Linux (і як вони використовуються в Makefile).
Якуб Нарбський

Це дає унікальний, але не ВПРОВАДЖИМ ідентифікатор. Не працює для мене. Однак відповідь Бен Аткіна пропонує підрахунок прихильності, який на практиці повинен бути поступовим. Відповідь Аарона Дігулли впевненіша, але вимагає також більшої роботи.
JOM

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

34

Ви не перший, хто задумався про "номер редакції" в Git , але "wc " є досить небезпечним, оскільки фіксація може бути стерта або видалена, а історія переглянута.

"Ревізійний номер" був особливо важливим для Subversion, оскільки він був необхідний у випадку злиття (SVN1.5 та 1.6 були покращені на цьому фронті).

Ви можете закінчити попередній запуск, який міститиме номер ревізії в коментарі, з алгоритмом, який не передбачає пошуку всієї історії гілки, щоб визначити правильне число.

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

(Як вказується у відповіді Бомбе , Git насправді має власний алгоритм, заснований на останньому тезі, плюс кількість комітів плюс трохи ключа SHA-1). Ви повинні побачити (і висловити позицію) його відповідь, якщо вона працює для вас.


Щоб проілюструвати ідею Аарона , ви також можете додати хеш Git фиксації у файл "інформація" програми, який ви поширюєте разом із додатком.

Таким чином, поле about буде виглядати так:

Про коробку

Номер програми є частиною комісії, але "інформація" програми "генерується" під час упаковки, фактично пов'язуючи номер складання додатка з ідентифікатором технічної редакції .


2
Я оновив свій сценарій для роботи з Xcode 3. Ви можете підібрати актуальну версію на сайті gist.github.com/208825 .
Abizern

34

Ви можете просто використовувати:

git shortlog -s -n

Результат:

 827  user one
    15  user two
     2  Gest 

22

Простий спосіб:

 git log --oneline | wc -l

oneline забезпечує це.


1
'wc' не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл.
user815693

Ну яку систему ви використовуєте? Це UNIX? /
Джиммі Кейн

1
Це також здається швидшим, якщо у вас є тисячі комісій. Всі інші команди займають занадто багато часу.
Danny Coulombe

21

Щоб перетворити його в змінну, найпростіший спосіб:

export GIT_REV_COUNT=`git rev-list --all --count`

5
Дійсно, git rev-listце правильний інструмент для використання, git logяк не кажуть інші.
Наюкі

1
Щоб підрахувати кількість комітетів у рядку, щоб досягти HEAD: git rev-list --first-parent | wc -l
200_success

Вам не потрібно wc -lпросто використовувати --countперемикач: git rev-list --all --count.
slm

Дякую @slm, я оновив відповідь. Хоча, я підозрюю, що оригінальна відповідь старша за сам --countкомутатор.
Джон Гітцен

@JohnGietzen - о так, я зрозумів, що 8-), просто додав цю деталь, щоб допомогти.
slm

17

Короткий список Git - це один із способів отримати детальну інформацію про виконання.

git shortlog -s -n

Це дасть кількість комітетів, а також ім'я автора. Параметр -s видаляє всі повідомлення про фіксацію для кожного комітету, зробленого автором. Видаліть той самий варіант, якщо ви хочете також бачити повідомлення про фіксацію. Параметр -n використовується для сортування всього списку. Сподіваюсь, це допомагає.


2
git shortlogсам по собі не стосується початкового питання про загальну кількість комітетів (не групується за автором). Використовуйте git rev-list HEAD --countзамість цього.
ctrueden


7

Існує хороший помічник сценарію, який користувачі Git використовують для створення корисного номера версії на основі опису Git. Я показую сценарій і пояснюю його у своїй відповіді на те, як би ви включили поточний ідентифікатор фіксації у файли проекту Git? .


4

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

git rev-list --full-history --all | wc -l

Це виведе лише число. Ви можете його псевдонімом на щось подібне

git revno

щоб зробити речі справді зручними. Для цього відредагуйте .git/configфайл та додайте це до:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Це не буде працювати в Windows. Я не знаю еквівалента "wc" для цієї ОС, але написання сценарію Python для підрахунку для вас було б багатоплатформеним рішенням.

EDIT : Отримайте підрахунок між двома командами:


Я шукав відповідь, яка б показала, як отримати кількість комітетів між двома довільними переглядами, і не побачила жодної.

git rev-list --count [older-commit]..[newer-commit]

3

Створіть число під час збирання та запишіть його у файл. Щоразу, коли ви робите реліз, введіть цей файл із коментарем "Build 147" (або будь-яким номером збірки на даний момент). Не фіксуйте файл під час звичайної розробки. Таким чином, ви легко можете зіставити номери складання та версії в Git.


Якби двоє розповсюджених розробників зробили це, вони не збираються / перетинаються періодично? Що робити, якщо вони обоє зробили збір між одними і тими ж оборотами спільного репо, або, можливо, зіткнення відбудеться лише в тому випадку, якщо жодна з змін не відбудеться до спільного репо. Не впевнений.
варильні панелі

Звичайно, але конфлікт підказує, що вам робити: просто поговоріть з іншим хлопцем або завжди використовуйте більшу кількість. Пам'ятайте: число не може магічно вилікувати порушений процес збирання. Це просто нагадування або натяк, що вам потрібно щось перевірити.
Аарон Дігулла

1
Ага, так, чарівний файл buildno.txt вводиться разом з рештою. Хороший підхід для невеликої команди чи великої команди, яка уникає паралельних побудов. Єдине місце, про яке я можу подумати, що це може не працювати, як це для великої команди, що використовує сценарій мови (python), який не потребує процесу збирання (призначити одну людину для будівництва).
варильні панелі

3

У нашій компанії ми перейшли з SVN в Git. Відсутність ревізійних номерів була великою проблемою!

Виконайте git svn clone, а потім позначте останню фіксацію SVN за її номером версії SVN:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Тоді ви можете отримати номер редакції за допомогою

git describe --tags --long

Ця команда дає щось на кшталт:

7603-3-g7f4610d

Значить: Останній тег 7603 - це версія SVN. 3 - це кількість комісій від неї. Нам потрібно їх додати.

Отже, номер редакції можна порахувати за цим сценарієм:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

Я використовував:

git log | grep "^commit" | wc -l

Просто, але це спрацювало.


4
Для підрахунку потрібен один рядок повідомлення про фіксацію, починаючи з "фіксувати". Наприклад: "виправлені помилки та зламані тести, які я випадково натиснув на останнє \ nкомітувати"
Paweł Polewicz

1

Використовуючи синтаксис Bash,

$(git rev-list --count HEAD)

виглядає чудово для чисто лінійної історії. Якщо ви також хочете іноді мати "цифри" від гілок (виходячи з master), врахуйте:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

При запуску з каси masterви отримуєте просто 1234.0або подібне. Під час запуску з каси філії ви отримаєте щось на зразок 1234.13, якщо на цій гілці було зроблено 13 комісій. Очевидно, це корисно лише в тому випадку, якщо ви базуєтеся не більше однієї гілки даної задачіmaster редакції.

--first-parent можна було б додати до мікро числа, щоб придушити деякі комітети, що виникають лише через об'єднання інших гілок, хоча це, мабуть, непотрібно.


1

Ви можете спробувати

git log --oneline | wc -l

або перерахувати всі комісії, зроблені людьми, що вносять внесок у сховище

git shortlog -s

1

git config --global alias.count 'rev-list --all --count'

Якщо ви додасте це до своєї конфігурації, ви можете просто посилатися на команду;

git count


0

Використовуйте Git короткий журнал саме так

git shortlog -sn

Або створити псевдонім (для терміналу на базі ZSH)

# show contributors by commits alias gcall="git shortlog -sn"


0

Як щодо виготовлення alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.