Noticias técnicas sobre GitUI
(github.com/extrawurst)- GitUI es una herramienta que ofrece la usabilidad y comodidad de una GUI de Git dentro de la terminal, y surgió a partir de casos de uso donde las GUI de Git existentes se congelaban o se volvían lentas en repositorios enormes.
- Sus funciones principales incluyen uso solo con teclado, ayuda contextual, inspección de cambios, commit y amend, stage/unstage/revert/reset por archivo, hunk o línea, stash, push/fetch, gestión de ramas, búsqueda en el historial de commits y revisión de diffs.
- En una comparación que parseó más de 900 mil commits del repositorio Git de Linux,
gituiregistró 24 segundos y 0.17 GB de memoria, mientras quelazygitregistró 57 segundos y 2.6 GB, ytig4 minutos 20 segundos y 1.3 GB. - Entre los objetivos previos a la versión 1.0 están la visualización de la estructura de ramas en la pestaña de logs y interactive rebase; existen limitaciones conocidas en git-lfs, sparse repos y el manejo automático de
credential.helperpara HTTPS. - Actualmente no reemplaza por completo la shell de Git; más bien es una herramienta para usar junto con ella, complementando tareas incómodas en la shell de Git, como stash o staging por línea y hunk.
Una herramienta que lleva la experiencia de una GUI de Git a la terminal
- GitUI es una herramienta open source que ofrece la experiencia de usuario y la comodidad de una GUI de Git en la terminal.
- La motivación de desarrollo surgió de la experiencia de hacer la mayoría de las tareas de Git en la terminal, pero aun así recurrir con frecuencia a una GUI de Git para tareas como index, commit, diff, stash, blame y log.
- Las GUI de Git populares existentes tenían problemas en repositorios enormes: fallaban, dejaban de responder o se volvían inutilizables.
- GitUI apunta a ofrecer una experiencia de GUI de Git dentro de la terminal que sea portable, fast, free y opensource.
Alcance de funciones
- El modelo de uso se centra en control solo con teclado y ayuda contextual, y está diseñado para no exigir memorizar muchos atajos.
- El trabajo con cambios incluye lo siguiente:
- Inspect de cambios, commit y amend
- Hooks
pre-commit,commit-msg,post-commityprepare-commit-msg - Stage, unstage, revert y reset por archivo, hunk o línea
- También admite tareas del flujo del repositorio:
- Guardar, pop, apply, drop e inspect de stash
- Push a un remote y fetch desde un remote
- Crear, renombrar, eliminar y hacer checkout de ramas, y ver remotes
- Navegación y búsqueda en el historial de commits, y revisión de diffs de cambios commiteados
- La UI y el funcionamiento interno incluyen una UI de terminal responsiva, una API de Git asíncrona para una interacción fluida y soporte para submodules.
- GPG commit signing está soportado, pero tiene restricciones relacionadas con #97.
Resultados de benchmark
- En una presentación del meetup RustBerlin se compararon
lazygit,tigygituiparseando todo el repositorio Git de Linux.- El repositorio objetivo incluye más de 900 mil commits.
- El material de la presentación está enlazado como RustBerlin meetup presentation y slides.
- Los resultados de la comparación fueron los siguientes:
gitui: 24 segundos, 0.17 GB de memoria, binario de 10 MB, sin freeze, sin crashlazygit: 57 segundos, 2.6 GB de memoria, binario de 25 MB, con freeze, crash ocasionaltig: 4 minutos 20 segundos, 1.3 GB de memoria, binario de 0.6 MB, freeze ocasional, sin crash
- En esta comparación,
gituiregistró los valores más bajos en tiempo y memoria.
Roadmap previo a la versión 1.0 y limitaciones conocidas
- Hay dos objetivos principales antes de llamarlo 1.0:
- Las limitaciones actuales incluyen lo siguiente:
- Actualmente, GitUI no reemplaza por completo la shell de Git, y funciona bien usar ambas herramientas juntas.
- La prioridad está puesta en funciones que resultan incómodas en la shell de Git, como stash y staging por línea o hunk.
- El proyecto actualmente es un spare time project, y se necesita ayuda para convertir GitUI en una one stop solution.
Instalación y compilación
- GitUI está en estado beta, por lo que puede tener bugs y funciones faltantes.
- Es razonablemente estable para uso personal y también se usa para desarrollar el propio GitUI.
- Se puede instalar con varios package managers:
- Arch Linux:
pacman -S gitui - Fedora:
sudo dnf install gitui - openSUSE:
sudo zypper install gitui - Homebrew:
brew install gitui - MacPorts:
port install gitui - Winget:
winget install gitui - Scoop:
scoop install gitui - Chocolatey:
choco install gitui - Mise:
mise use -g gitui@latest - Termux:
pkg install gitui - Anaconda:
conda install -c conda-forge gitui
- Arch Linux:
- Los binarios de release están disponibles para Linux, macOS y Windows.
- Linux cuenta con paquetes para x86_64, aarch64, arm y armv7.
- macOS cuenta con paquetes para arm64 e Intel x86.
- Windows cuenta con un binario único de 64 bits y un paquete de instalación MSI de 64 bits.
- Los requisitos de compilación son los siguientes:
- La versión mínima soportada de
rust/cargoes 1.88. - Para compilar la dependencia de OpenSSL se requiere perl 5.12 o superior y un compilador de C.
- Para ejecutar toda la suite de pruebas se necesita Python invocable como
python.
- La versión mínima soportada de
- Con Cargo se puede iniciar la compilación e instalación con el comando
cargo install gitui --locked. - La Cargo feature
trace-libgitactiva el tracing delibgit2, y funciona silibgit2fue compilado con-DENABLE_TRACE=ON. - Esta feature viene activada por defecto; para desactivarla, usa
cargo install --no-default-features.
Configuración, diagnóstico y personalización
- El logging se activa con
gitui -l. - La ubicación del archivo de logs varía según la plataforma:
- macOS:
$HOME/Library/Caches/gitui/gitui.log - Linux with
XDG:$XDG_CACHE_HOME/gitui/gitui.log - Linux:
$HOME/.cache/gitui/gitui.log - Windows:
%LOCALAPPDATA%/gitui/gitui.log
- macOS:
- GitUI debería funcionar automáticamente tanto con temas de terminal light como dark.
- Los temas de color se pueden personalizar a gusto siguiendo
THEMES.md. - Los key bindings se pueden personalizar siguiendo
KEY_CONFIG.md, y pueden configurarse con bindings estilovim. - Los proyectos citados como inspiración son lazygit, tig, GitUp y git-brunch.
- Sobre GitUp, se agrega el objetivo de encontrar una forma de usar una map view en una herramienta de terminal.
1 comentarios
Opiniones en Hacker News
Apenas lo instalé, la ventana de xterm era demasiado chica, así que la agrandé; intenté reducir el área del árbol de archivos arrastrando el borde, pero no se pudo.
Quería ver el diff más grande y los nombres de archivo eran cortos, así que la mayor parte del área del árbol se desperdiciaba. En la ayuda con H tampoco había una tecla relacionada, así que parece que tampoco se puede ajustar el tamaño con el teclado.
Incluso si fuera posible con el teclado, en estos casos redimensionar con el mouse es mucho más fácil y rápido, y estaría bueno que también hubiera ajuste con teclado para cuando no se puede usar el mouse, como en entornos SSH rotos.
Incluso en Vim, las partes donde sigo usando trackpad/mouse son el scroll y el cambio de tamaño de ventanas, y no hay razón para no ofrecer ambas cosas también a través de SSH.
Creo que también sería una buena incorporación aquí.
lazygit aparece como inspiración de este proyecto; como usuario de lazygit, me da curiosidad saber qué le faltaba como para necesitar un proyecto completamente nuevo.
Uso lazygit y me resulta muy útil.
Para una presentación del meetup RustBerlin, parsearon todo el repositorio Git de Linux para comparar lazygit, tig y gitui, y el repositorio tenía más de 900.000 commits.
gituitardó 24 segundos, usó 0,17 GB de memoria, binario de 1,4 MB, sin congelarse ni crashear;lazygittardó 57 segundos, 2,6 GB, 16 MB, con congelamientos y crasheos ocasionales; ytigtardó 4 min 20 s, 1,3 GB, 0,6 MB, con congelamientos ocasionales y sin crasheos.Según recuerdo, no tenía ninguna función que no existiera en lazygit; más bien le faltaban algunas funciones que sí tiene lazygit.
Dice que la mayoría de las tareas de Git las hacen en la terminal, pero que para index, commit, diff, stash, blame y log terminaban usando con frecuencia una GUI de Git, y que las GUI populares de Git fallaban o dejaban de responder en repositorios enormes, por lo que no se podían usar.
Eso de que “las GUI populares de Git fallan o dejan de responder en repositorios enormes” solo lo he visto cuando
git statustarda mucho en la línea de comandos o en magit por un árbol de directorios muy profundo que todavía no se agregó a.gitignore.En esos casos no veo diferencia entre usar Git desde una GUI, una TUI o la línea de comandos.
¿Otras interfaces de Git fallan de forma más dramática que el propio Git?
Incluso con el mismo problema, en la línea de comandos
git statusterminaba casi al instante.Es inevitable que mostrar mucha información requiera tiempo, pero magit en algunos puntos actúa de forma demasiado eager y a veces crea un flujo de trabajo mucho más costoso que el flujo de Git en bruto.
La UI de Git de IntelliJ está escrita en Java e incluida dentro del IDE, y aun así es lo suficientemente rápida, así que una UI externa de Git no debería tener problemas.
Artículos relacionados:
GitUI: Terminal UI for Git - https://news.ycombinator.com/item?id=32864036 - septiembre de 2022, 90 comentarios
Terminal-UI for Git written in Rust - https://news.ycombinator.com/item?id=25504811 - diciembre de 2020, 1 comentario
¿Alguien ha creado una UI de clic y arrastrar para Git?
Me refiero a una UI en la que puedas trabajar simplemente arrastrando y soltando ramas.
Soporta arrastrar y soltar para varias operaciones como merge, rebase y stage/unstage, y probablemente para más cosas.
Es un cliente Git bastante simple, pero tiene algo de funcionalidad de arrastrar para operaciones como cherry-pick de commits.
https://marketplace.visualstudio.com/items?itemName=trunkflo...
Pruebo todas estas herramientas, pero siempre les falta una función clave o no se comportan como quiero, así que al final vuelvo a tig.
En GitUI no pude encontrar una visualización que muestre bien la estructura de ramas en lugares como la vista Log.
Me gustaría una herramienta que muestre bien la estructura de ramas pensando en rebase.
Se ve bien, así que pienso probarlo.
Espero que algún día GitExtensions se porte como aplicación nativa de Linux.
He probado decenas de UIs y parece que no hay nada a su nivel.
Todavía no ha habido una UI de Git que haga que un sistema basado en menús contextuales se sienta tan natural como TortoiseGit.
La única otra UI de Git que se le acerca es Tortoise, aunque antes solo probé la variante para hg.
En Linux todavía uso la versión 2.x con mono.
Se parece mucho a neogit, un plugin de Neovim que empecé a usar hace aproximadamente un mes.
Los keybindings eran un poco toscos y me tomó alrededor de una hora acostumbrarme de verdad al flujo completo, pero después de acostumbrarme se volvió mucho más rápido que mi método anterior: suspender neovim y usar Git directamente en la shell.
0: https://github.com/NeogitOrg/neogit
Una de las cosas que me preocupan de las herramientas con UI es que muchas veces le ocultan al usuario los comandos reales, lo que luego dificulta razonar qué salió mal y cómo evitarlo en el futuro.
Por ejemplo, algunas herramientas pueden agregar flags bastante opinados que no encajan con el flujo normal de la CLI.
No sé si esto aplica a esta herramienta, pero podría ser feedback interesante para herramientas de esta categoría.
Siempre muestra el comando completo que ejecuta, y también se puede ver el log completo.