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

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


person pocesar    schedule 20.05.2013    source источник
comment
Простите, а что такое поддерево? Запуск git subtree дал мне git: 'subtree' is not a git command. .   -  person Jokester    schedule 20.05.2013
comment
Поддерево git @pocesar было объединено с основной git, и он доступен с версии 1.7.11   -  person 1615903    schedule 20.05.2013
comment
действительно, но некоторые версии git (например, из @jokester выше) не поставлялись с ним. Я использую msysgit 1.8.2.1 в Windows, и он поставляется с ним :)   -  person pocesar    schedule 20.05.2013
comment
Хммм... Я только что собрал 1.8.4 из исходников, чтобы получить последнюю версию, и там также написано, что "поддерево" не является командой git. Моя git --version' говорит: git версия 1.8.4.rc1.4.gd6cbf2f   -  person Stabledog    schedule 05.08.2013
comment
Загадка раскрыта: недостаточно собрать git, нужно еще собрать contrib/subtree (там есть файл INSTALL). В противном случае даже последний git будет жаловаться, что «поддерево» не имеет смысла.   -  person Stabledog    schedule 05.08.2013


Ответы (3)


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

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

Поскольку в поддереве должна быть папка с таким же именем в корневой папке репозитория, вы можете запустить это, чтобы получить нужную информацию (в оболочке 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 включить его в следующие версии :)

person Sagi Iltus    schedule 20.08.2013
comment
команда, которую вы даете, не работает для меня. журнал git | grep git-subtree-dir не возвращает никаких результатов (версия git 1.7.9.5) - person FlipMcF; 06.09.2013
comment
+1. @procesar, FlipMcF: у меня это работает в git bash в Windows: версия git 1.8.5.2.msysgit.0. Причина, по которой это должно работать, заключается в том, что команда git subtree добавляет несколько строк, начинающихся с git-subtree-, в сообщение коммита, и одна из строк выглядит как git-subtree-dir:you-prefix-folder. Для профи - просто посмотрите на вывод git log сразу после запуска git subtree add... и вы увидите эти строки. - person Eddy Shterenberg; 08.01.2014
comment
@FlipMcF, официальная поддержка поддерева была добавлена ​​​​в версии 1.7.11, поэтому я предполагаю, что вы используете старый и отсоединенный модуль поддерева, который не работает в современных версиях. Вы можете либо установить самый последний скрипт поддерева (см. здесь) или обновить всю установку git. - person Sagi Iltus; 14.01.2014
comment
Спасибо! Вот почему я обязательно включил свою версию в свой комментарий. У меня было подозрение, что это из-за моей старой версии. - person FlipMcF; 18.01.2014
comment
Круто, рады, что смогли помочь :) - person Sagi Iltus; 30.01.2014
comment
stackoverflow.com/questions/16641057/ - person smarber; 13.11.2017
comment
git subtree является официальным. У него также есть некоторые недостатки... Вот почему git vendor был изобретен manpages.debian.org/testing/git-man/git-subtree.1.en.html github.com/brettlangdon/git-vendor - person Sandburg; 08.01.2020
comment
git subtree не является официальным, если он находится в каталоге contrib исходного кода Git... - person philb; 23.07.2021

Следуя ответу Саги Иллтуса, добавьте следующий псевдоним в свой ~/.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
person miraculixx    schedule 04.12.2014
comment
Это было бы здорово, за исключением того, что в моем репо выдает дубликаты - вероятно, потому, что я добавил удаленное и повторно добавил поддерево. Когда я действительно знаю, что делаю, это будет полезно ;-) - person ; 30.07.2015
comment
@MattBracewell Взгляните на uniq. Вы можете обновить псевдоним, чтобы передать его, или git ls-subtrees|uniq - person kenchilada; 16.02.2017
comment
Или используйте sort -u и получите каталоги в алфавитном порядке в качестве бонуса! - person Potherca; 18.10.2017

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

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