É possível fazer cd para um ancestral dentro de uma árvore de diretórios sem saber até onde preciso ir?

É possível fazer cd para um ancestral dentro de uma árvore de diretórios sem saber até onde preciso ir?

Estou escrevendo um script para automatizar a adição, confirmação e envio de alterações para meu submódulo e repositório. Alguns submódulos estão mais aninhados do que outros e preciso fazer o cd de volta para a raiz do repositório. Não estou usando o git submodule foreachpadrão porque pode haver alterações em outros submódulos que não quero confirmar (um teste rápido) do branch em que estou trabalhando. Eu tenho uma ramificação no super-repo configurada para cada submódulo, convenientemente nomeada de forma que usar cd com ele irá para o repo.

eu encontreiessa questãoque tem respostas relacionadas à criação e/ou alias de uma função para criar n níveis. Eu poderia fazer algo assim, pois já tenho algumas funções de alias para outras ações, mas isso exigiria uma função diferente para cada diretório ou um script diferente, portanto, uma tecla de atalho diferente, nas extensões Git que estão em um nível diferente.

Estou usando extensões Git para gerenciar meu repositório e ele fornece uma interface de script em suas configurações. Minha função atual sob o alias em .git/config:

applyupdate = "!f() { \
                      cd \"$1\"/;\
                      git add .;\
                      git commit -m \"$2\";\
                      git push;\
                      cd ..;\ #####this needs to be n levels
                      git add \"$1\";\
                      git commit -m \"$2\";\
                      git push;\
                    }; f"

Isso é executado na extensão Git por meio de uma tecla de atalho que o executa com os seguintes argumentos:

applyupdate {cBrnach} {{UserInput}}

onde {cBranch}será o branch ativo ou solicitará um branch se vários estiverem no mesmo commit no gráfico
e {{UserInput}}abrirá uma caixa de diálogo para inserir uma mensagem de commit entre aspas.

Pode cd n-levelsser feito com uma única função e de forma que não precise inserir quantos níveis preciso subir? Não acho que a {UserInput}opção nas extensões Git funcione com múltiplas entradas.

Responder1

Graças aArkadiusz Drabczykpor mencionar git rev-parse --show-toplevel.
Alterar o script para isso funciona para mim:

applyupdate = "!f() { \
                      cd \"$1\"/;\
                      git add .;\
                      git commit -m \"$2\";\
                      git push;\
                      cd ..;\ #this gets me out of the submodule
                      cd \"$(git rev-parse --show-toplevel)\";\ #this return to super-repo's root
                      git add \"$1\";\
                      git commit -m \"$2\";\
                      git push;\
                    }; f"

informação relacionada