Ответ 1
Следующее должно работать даже в голых репозиториях:
git blame <rev> -- <path>
например.
git blame master -- README.txt
на моем сервере Я размещаю свои личные проекты git с удаленной стороны (с gitosis), и я создал веб-интерфейс для просмотра репозиториев (что-то вроде Github).
На удаленной стороне вам не разрешено делать много вещей, потому что отсутствует рабочее дерево, и это правильно: btw, для проводника репозитория, с несколькими командами, которые я могу сделать почти все.
За исключением git вины.
Я не могу узнать, как обвинить файл без рабочего дерева в репозитории на удаленной стороне. У вас есть идеи?
Следующее должно работать даже в голых репозиториях:
git blame <rev> -- <path>
например.
git blame master -- README.txt
Я не могу найти, о чем говорят git docs - опция, кстати, это работает очень
На самом деле, это необходимо, потому что " git blame
" готов принять древний нечетный порядок аргументов " blame <path> <rev>
" в дополнение к обычному " blame [<rev>] <path>
".
Это означает, что Git 2.17 (Q2 2018) объяснит " git blame HEAD COPYING
" в пустом хранилище, которое не удалось запустить, в то время как " git blame HEAD -- COPYING
" работает просто отлично.
Но начиная с версии 2.17 вам больше не понадобится " --
".
См. Коммит 0c668f5 (05 февраля 2018 г.) Джунио С. Хамано (gitster
).
(Объединено Junio C Hamano - gitster
- в коммите 0c668f5, 07 февраля 2018 г.)
blame
: затянуть парсер командной строкиУ древнего нечетного порядка аргументов "
blame <path> <rev>
" в дополнение к обычному "blame [<rev>] <path>
" есть по крайней мере два отрицательных значения:
Чтобы разделить эти два элемента, он проверяет, называет ли последний аргумент командной строки путь в рабочем дереве, используя
file_exists()
.
Однако "blame <rev> <path>
" - это запрос на объяснение каждой строки в содержимом<path>
хранящегося в ревизии<rev>
и не требует наличия версии файла рабочего дерева. Проверка с помощьюfile_exists()
просто неверна.Чтобы заставить эту ошибочную
file_exists()
работать, код вызываетsetup_work_tree()
прежде чем сделать это, потому что путь, который он имеет, относится к верхнему уровню дерева проекта.
Тем не менее, "blame <rev> <path>
" ДОЛЖЕН быть применимым даже вsetup_work_tree()
хранилище, и нет никаких причин позволятьsetup_work_tree()
жаловаться и умирать с "Эта операция должна выполняться в рабочем дереве".Чтобы исправить первый, переключитесь, чтобы проверить, является ли последний токен ревизией (и, если это так, проанализируйте аргументы, используя правило "
blame <path> <rev>
").Исправьте последнее, избавившись от
setup_work_tree()
иfile_exists()
Единственный случай, когда вызов этой функции имеет значение, - это когда мы запускаем "blame <path>
" (т.е. не начинаем ревизию и просим обвинить файл рабочего дерева). в<path>
, просматривая ревизиюHEAD
), но есть вызов вsetup_scoreboard()
непосредственно передfake_working_tree_commit()
.
Короче говоря, начиная с Git 2.17, это будет работать в обычном репо:
git blame master -- README.txt
А в Git 2.22 сообщение об ошибке " This operation must be run in a work tree
" должно исчезнуть!
" git blame -- path
" в не пустом хранилище начинает обвинять из рабочего дерева, и та же самая команда в пустом хранилище выдает ошибку, потому что не существует рабочего дерева по определению.
Команда научилась вместо этого обвинять от коммита в HEAD, что более полезно.
См. Коммит a544fb0 (07 апреля 2019 г.) от SZEDER Gábor (szeder
).
(Объединено Junio C Hamano - gitster
- в коммите d8620d3, 25 апреля 2019 г.)
blame
: по умолчанию HEAD в голом репо, когда стартовый коммит не указанКогда '
git blame
' вызывается без указания коммита, с которого нужно начинать обвинять, он начинается с заданного состояния файла в рабочем дереве.
Однако при вызове в пустом репозитории без начальной фиксации состояние рабочего дерева отсутствует, и оно умирает со следующим сообщением об ошибке:$ git rev-parse --is-bare-repository true $ git blame file.c fatal: this operation must be run in a work tree
Это вводит в заблуждение, поскольку подразумевает, что "
git blame
" вообще не работает в голых репозиториях, но, на самом деле, работает нормально, когда ему дают коммит для запуска.Конечно, мы могли бы улучшить сообщение об ошибке, но вместо этого просто оставьте значение по умолчанию HEAD в пустом хранилище, так как, скорее всего, это то, что пользователь хотел в любом случае (если он хочет начать с другого коммита, он указал бы это в первое место).
"
git annotate
" - это всего лишь тонкая оболочка вокруг "git blame
", поэтому в той же ситуации он напечатал то же вводящее в заблуждение сообщение об ошибке, и этот патч также исправляет его.