Номер строки Git до и после - PullRequest
3 голосов
/ 16 мая 2011

У меня есть несколько мастер-коммитов в моем git-репо. Некоторые коммиты помечены тегами git. Давайте посмотрим на пример:

commits:  Master -> Master -> Master -> Master
tags:       v1        v2        v3       HEAD

Теперь у меня есть отчет о том, что на v2 есть ошибка в файле имя файла в строке 45.

Есть ли способ получить номер строки на основе HEAD и номер строки 45 в v2?

git diff HEAD v2 filename покажи мне различия, но я действительно хочу просто "новый" номер строки.

Чтобы быть более точным, если я добавил 3 строки в коммите v3 и чем удалил 1 строку в последнем коммите (HEAD), какая-то команда git должна дать мне 45 + 3 - 1 = 47.

1 Ответ

3 голосов
/ 16 мая 2011

Намного проще было бы использовать git blame:

git blame $ref -L'/search_pattern/,+1' filename(s)

Полный пример в моем репозитории zfs-fuse:

$ git for-each-ref --format='%(refname)' -- refs/heads |
       while read ref; 
            do git blame $ref -L'/push/,+1' zfs_operations.c; 
       done

Как вы можете видетьполовина работы заключается в получении названий филиалов;Конечно, вы можете просто жестко изменить код, если это проще для вашего использования. Вывод из вышеперечисленного:

f5370a5e (Emmanuel Anne 2011-02-22 20:53:17 +0100 1492) static void push(zfsvfs_t *zfsvfs, cred_t *cred, fuse_ino_t ino, file_info_t *info, const char *buf, size_t size, off_t off)
f5370a5e (Emmanuel Anne 2011-02-22 20:53:17 +0100 1512) static void push(zfsvfs_t *zfsvfs, cred_t *cred, fuse_ino_t ino, file_info_t *info, const char *buf, size_t size, off_t off)
f5370a5e (Emmanuel Anne 2011-02-22 20:53:17 +0100 1512) static void push(zfsvfs_t *zfsvfs, cred_t *cred, fuse_ino_t ino, file_info_t *info, const char *buf, size_t size, off_t off)

Обратите внимание на номера строк ( 1492 против 1512 ):

f5370a5e (Эммануэль Энн 2011-02-22 20:53:17 +0100 1512 ) статический толчок пустоты (zfsvfs_t * zfsvfs, cred_t * cred, fuse_ino_tino, file_info_t * info, const char * buf, size_t size, off_t off)

Любые ревизии, которые не соответствуют шаблону поиска, покажут

fatal: -L parameter 'push': No match

Вы также хотите посмотреть на варианты:

 -M    (detect moved lines)
 -n    (show source line number)
 -f    (show filename, especially handy with -C)
 -p / --incremental: if you want something parsed more easily in code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...