Как перечислить каждый файл для каждой ревизии в Git (например, hg manifest --all Mercurial --all)?

10

У Mercurial есть команда, чтобы перечислить каждый файл, который есть в хранилище для каждой ревизии:

hg manifest --all

Есть ли эквивалентная команда в Git?

IT2
источник
Что-то вроде git log --stat?
jmreicha
4
git ls-files?
NN
Просто любопытно, по какой причине вам это нужно?
Стивен Дженнингс
@StephenJennings: это лучший способ узнать, какие файлы находятся под контролем версий, чем мысленно делать « ls -Rминус .gitignore». Полезность в целом: можно более или менее знать, что происходит, но самоанализ хранилища дает уверенность, которую он знает. Такая уверенность особенно важна для начинающих пользователей и позволяет понять, насколько приятна программа. Git не делает заверение своих пользователей приоритетом, поэтому многие люди ненавидят его до тех пор, пока не узнают.
Esteis

Ответы:

3

Я абсолютно ужасен в сценариях оболочки, так что это, безусловно, неоптимально, но такого рода вещи могут сделать это для вас, если вы используете bash. Надеюсь, кто-нибудь еще может прийти и почистить его или заменить на что-нибудь получше. Я только протестировал его на своем Mac, так что будьте осторожны.

Он должен печатать все файлы в коммитах, которые являются предками текущего HEAD. Сохраните его в файле, который называется manifest.shгде-то на вашем пути:

#!/bin/bash

TFILE=$(mktemp -t git-manifest)

for sha in $(git log --pretty=format:%H)
do
    git ls-tree --name-only --full-tree -r $sha >> $TFILE
done

sort -u $TFILE
rm $TFILE
Стивен Дженнингс
источник
1
Нет необходимости, exportпоскольку он не должен быть доступен в дочерних процессах. Если цикл находится над хэшем SHA, цикл работает просто отлично, иначе readлучше использовать переменную и заключить ее в кавычки. sortесть -uопция, которая делает то, что uniqделает. Файл не получит rmd, когда вы отмените на полпути, вам понадобится trapдля этого, но это, вероятно, будет чрезмерным для этого сценария.
Даниэль Бек
@DanielBeck: Спасибо, я немного его обновил. mktempне существует в Git Bash, я должен найти способ справиться с этим, чтобы Windows тоже могла играть.
Стивен Дженнингс