Дізнайтеся творця гілки Git


159

Я хочу з’ясувати, хто створив філію.

Я можу це зробити з:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

Однак це повертає останнього комітента на галузь, не обов'язково особу, яка створила філію.


7
Ви не можете знайти автора / творця гілки в git. Що ви тут робите, це отримати підказку автора відділення. Це зміниться, як тільки хтось підштовхне там нове зобов'язання.
sylvain.joyeux

1
Відмова від відповідальності: неявне припущення в цьому запитанні / відповіді "в робочому процесі з однією людиною на галузь ". В інших робочих процесах, де щонайменше двоє співробітників діляться філією, ця інформація (створювач гілки) недоступна через git, і відповіді вище можуть призвести когось до помилкових припущень.
RomainValeri

Відповіді:


56

Гілка - це не що інше, як покажчик фіксації. Як такий, він не відслідковує метадані типу "хто створив мене". Побачте самі. Спробуйте cat .git/refs/heads/<branch>у своєму сховищі.

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

Також відповідь DarVar нижче - дуже розумний спосіб отримати цю інформацію.


Для мене це було у .git / refs / heads / <branch> "ref" було множиною
Jeffrey LeCours

4
Відповідь DarVar, хоча, мабуть, корисний для деяких, не є точною відповіддю. Це просто більш лаконічний спосіб зробити те, що вже робив автор оригінального запитання (а саме отримати ім’я останнього виконавця у відділенні).
peabody

296

Перерахуйте віддалені гілки Git за автором, відсортовані за датою введення:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate

8
Це остання особа, яка бере на себе зобов’язання в цій галузі. Оскільки гілка є лише покажчиком на коміт.
ДарВар

7
Чи має це працювати в Windows? Я отримав "Вхідний файл вказаний два рази."
Стів Чемберс

27
З форматом у табличному форматі: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(отримав ідею від stackoverflow.com/a/3631819 - можливо, потрібно буде відрегулювати цифри в awk printf залежно від максимальної тривалості дати / імені автора)
Gary S. Weaver

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

9
Хоча ця відповідь та команда потенційно корисні, я вважаю, що це помилкова відповідь на питання. У цьому списку перелічені імена авторів у всіх гілках, які є останніми виконавцями на гілці. Існує низка обставин, за яких насправді це не було творцем галузі. Справжня відповідь полягає в тому, що git просто не зберігає цю інформацію.
peabody

46

Я перетворив попередні відповіді, використовуючи --sortпрапор, і додав кольори / форматування:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes

1
ідеально підходить для звинувачення в кольорах
suarsenegger


8

Додавання до відповіді DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: Ми використовували AWK для гарного друку автора та віддаленої гілки.


3
це працює лише в тому випадку, якщо ім'я автора - це одне слово. Якщо ім’я та прізвища відокремлені, то замість назви гілки ви побачите прізвище ...
Legato

5

Ви можете дізнатись, хто створив філію у вашому локальному сховищі

git reflog --format=full

Приклад виводу:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Але це, мабуть, марно, як правило, у вашому локальному сховищі ви створюєте лише гілки.

Інформація зберігається у ./.git/logs/refs/heads/ відділенні . Приклад вмісту:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

Остання фіксація в цьому прикладі була від користувача "b", тоді як гілка "b2" була створена користувачем "a". Якщо ви зміните своє ім’я користувача, ви можете переконатися, що git reflog бере інформацію з журналу та не використовує локального користувача.

Я не знаю про будь-яку можливість передавати цю локальну інформацію журналу до центрального сховища.


4

Ми можемо дізнатися на основі імені автора

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC

1

Припустимо:

  1. гілка була зроблена з master
  2. були об'єднані в masterще

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1

0

Я знаю, що це не зовсім сфера питання, але якщо ви виявите необхідність відфільтрувати лише зобов'язання конкретного автора, ви завжди можете вирішити проблему :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

щасливе кодування! :)


0

для тих, хто шукає DESC ... це, здається, працює --sort=-

Ти для форматування, нового в цьому ... мої очі втрачають частину його кровопролиття

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

подальша посилання: https://stackoverflow.com/a/5188364/10643471


-1

Наскільки я знаю, ви можете побачити, чи ви творець лише гілки. Про це вказує перший рядок у .git / ref / heads / <branch>. Якщо закінчується на "Створено з ГОЛОВИ", ви є творцем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.