Obtenga el directorio raíz de git repo, preferiblemente con magit

9

¿Cómo puedo obtener el directorio raíz del repositorio git actual? Podría correr shell-command-to-stringen algo así git rev-parse --show-toplevel. ¿Hay una mejor manera? ¿ magitO cualquier otro git front-end expone esta información?

Pradhan
fuente
¿Quieres decir en git rev-parse --show-toplevellugar de git rev-parse --git-dir?
Kyle Meyer
@phils Gracias! Tengo el mismo enlace publicado en uno de los comentarios bajo la respuesta de abo-abo :)
Pradhan
Ah, así lo hiciste :)
phils

Respuestas:

12

En Magit, esto está disponible como magit-toplevel(pero estoy de acuerdo con @ abo-abo en que tiene sentido usarlo vc-root-dir).

Kyle Meyer
fuente
vc-root-dirEs seguramente el más genérico. Sin embargo, no puedo hacer que funcione de esa forma como mencioné en los comentarios sobre la respuesta de @ abo-abo. Pero este funcionó directamente. ¡Gracias!
Pradhan
7

Es necesario vc-root-dir. Funciona por más que git.

abo-abo
fuente
3
¿Podrías dar más detalles? No veo una función o un paquete titulado vc-root-dir. Lo único que está cerca es vc-root-diff. Y en una vcbúsqueda relacionada, encuentro esto .
Pradhan
Es una función cargada automáticamente en vc.el, incorporada
abo-abo
Quizás mi vces demasiado viejo? Tengo el incorporado con emacs 24.3. No veo vc-rooten vc.elo con aproposetc. Mirando vc.el, veo cosas como (setq rootdir (vc-call-backend...)). Y de hecho, (vc-call-backend 'Git 'root default-directory)funciona.
Pradhan
1
nb creo que vc-root-dirsolo está en el baúl en esta etapa. Ciertamente no está en 24.4. Presumiblemente estará disponible en Emacs 25.
phils
2

Como se menciona por abo-abo, en Emacs 25, hay una función llamada vc-root-dirque hace lo que necesita de una manera independiente del backend. Para versiones anteriores de Emacs, el siguiente es un reemplazo adecuado:

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

Como mencionó Kyle, Magit proporciona la función magit-get-top-dir, que simplemente llama git rev-parse --show-cdupe interpreta el resultado.

jch
fuente
1
De hecho, después de mirar la implementación de vc-root-diff, lo intenté vc-deduce-backend. De alguna manera, eso regresa nilen mi git-repo. Sin embargo, vc-responsible-backend default-directoryvuelve Git.
Pradhan
Si el buffer actual no es rastreado por vc, entonces vc-deduce-backendregresa nil. ¿Eso lo explica?
jch
1
Ah, lo hace. Lo estaba ejecutando ielmy esperaba vc-deduce-backendusarlo default-directory. ¡Gracias!
Pradhan
¿Quiso decir en vc-root-dirlugar de vc-root-diff?
Michael Mrozek