Obtenha o diretório raiz do git repo, de preferência com o magit

9

Como posso obter o diretório raiz do repositório git atual? Eu poderia correr shell-command-to-stringem algo como git rev-parse --show-toplevel. Existe uma maneira melhor? Algum magitoutro front-end do git expõe essas informações?

Pradhan
fonte
Você quer dizer em git rev-parse --show-toplevelvez de git rev-parse --git-dir?
Kyle Meyer
@phils Obrigado! Eu tenho esse mesmo link postado em um dos comentários sob a resposta de abo-abo :)
Pradhan
Ah, então você fez :)
phils

Respostas:

12

No Magit, isso está disponível como magit-toplevel(mas eu concordo com @ abo-abo que faz sentido usar vc-root-dir).

Kyle Meyer
fonte
vc-root-diré certamente o mais genérico. No entanto, não consigo fazê-lo funcionar dessa forma, como mencionei nos comentários na resposta do @ abo-abo. Mas este funcionou direito. Obrigado!
Pradhan
7

Você precisa vc-root-dir. Funciona para mais do que git.

abo-abo
fonte
3
Você poderia elaborar? Não vejo uma função ou um pacote intitulado vc-root-dir. A única coisa que está perto é vc-root-diff. E em uma vcpesquisa relacionada, acho isso .
Pradhan
É uma função de carregamento automático no vc.el, embutido
abo-abo
Talvez o meu vcseja velho demais? Eu tenho esse embutido no emacs 24.3. Não vejo vc-rootdentro vc.elou com aproposetc. Olhando vc.el, vejo coisas como (setq rootdir (vc-call-backend...)). E, de fato, (vc-call-backend 'Git 'root default-directory)funciona.
Pradhan
11
nb eu acho que vc-root-diré apenas no porta-malas nesta fase. Certamente não está em 24.4. Presumivelmente, estarão disponíveis em Emacs 25.
phils
2

Conforme mencionado por abo-abo, no Emacs 25, existe uma função chamada vc-root-dirque faz o que você precisa de uma maneira independente de back-end. Para versões anteriores do Emacs, o seguinte é um substituto adequado:

(defun vc-root-dir ()
  (let ((backend (vc-deduce-backend)))
    (and backend
         (ignore-errors
           (vc-call-backend backend 'root default-directory)))))

Como mencionado por Kyle, o Magit fornece a função magit-get-top-dir, que simplesmente chama git rev-parse --show-cdupe interpreta o resultado.

jch
fonte
11
De fato, depois de analisar a implementação do vc-root-diff, tentei vc-deduce-backend. De alguma forma, isso retorna nilno meu git-repo. No entanto, vc-responsible-backend default-directoryretorna Git.
Pradhan
Se o buffer atual não for rastreado vc, vc-deduce-backendretornará nil. Isso explica isso?
jch 17/02/2015
11
Ah sim. Eu estava executando ielme esperando vc-deduce-backendusar default-directory. Obrigado!
Pradhan
Você quis dizer em vc-root-dirvez de vc-root-diff?
Michael Mrozek