Как я могу перечислить подделки git в корне?

Например, вы можете сделать git remote --verbose и git, показывая все удаленные объекты в вашем проекте, git branch покажет все ветки и сообщит текущую ветку, но как отобразить все поддеревья без любая деструктивная команда? git subtree предоставит примеры использования, но ничего не перечислит. поддерево имеют только add, pull, push, split, merge.

Ответ 1

Нет явного способа сделать это (по крайней мере, пока), здесь перечислены только доступные команды (как вы отметили сами, но здесь ссылка для будущих ищущих): https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt

Я прошел через код (в основном весь этот механизм представляет собой большой файл оболочки script), все отслеживание выполняется через сообщения фиксации, поэтому все функции используют механизм git log с большим количеством grep -ing чтобы найти его собственные данные.

Поскольку поддерево должно иметь папку с тем же именем в корневой папке репозитория, вы можете запустить ее, чтобы получить нужную информацию (в оболочке Bash):

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq

Теперь это не проверяет наличие папки или нет (вы можете удалить ее, и механизм поддерева не будет знать), поэтому здесь, как вы можете перечислить только существующие поддеревья, это будет работать в любой папке в репозиторий:

 git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then echo {}; fi'

Если вы действительно это сделаете, предложите Git ребятам включить в следующие версии:)

Ответ 2

В ответ на ответ Sagi Illtus добавьте следующий псевдоним к вашему ~/.gitconfig

[alias]
    ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'"

Затем вы можете git ls-subtrees из корня вашего репозитория показать все пути поддерева:

$> cd /path/to/repository
$> git ls-subtrees
some/subtree/dir

Ответ 3

Проблема с очисткой журнала заключается в том, что это ничего не говорит о том, существует ли поддерево или нет. Я обошел это, просто протестировав существование каталога:

[alias]
        ls-subtrees = !"for i in $(git log | grep git-subtree-dir | sed -e 's/^.*: //g' | uniq); do test -d $i && echo $i; done"