Как я могу перечислить 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-адрес репо поддерева.