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

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

4 ответа

Решение

Не существует какого-либо явного способа сделать это (по крайней мере, на данный момент), здесь перечислены только доступные команды (как вы сами отметили, но вот справочник для будущих искателей): https://github.com/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 ребятам включить их в следующие версии:)

В ответ на ответ Саги Илтуса добавьте следующий псевдоним в свой ~/.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

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

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

Посмотрите субрепо . Это устраняет недостатки при использовании «родных» команд поддерева git. эти недостатки связаны с тем, что git не хранит исходный URL-адрес репо поддерева.

Другие вопросы по тегам