En general utilizo bastante los comandos en terminal (por cierto, suelo usar Guake como emulador de terminal) directamente. Tengo definidos algunos alias para tareas comunes, no como alias en git, si no directamente en Bash1.

alias add='git add'
alias br='git branch -v'
alias cambios='git log --date-order --date=short --graph --full-history --all --pretty=format:"%h - %ad - %s"'
alias cambios_autor='git log --date-order --date=short --graph --full-history --all --pretty=format:"%h - %ad - %an - %s"'
alias ci='git commit -m'
alias cia='git commit -a -m'
alias co='git checkout'
alias cob='git checkout -b'
alias deshacer_ci='git reset --soft HEAD~1'
alias gcaa='git commit -a --amend -C HEAD'
alias nuevo='git log HEAD@{1}..HEAD@{0}'
alias push='git push'
alias pushom='git push origin master'
alias st='git status'
alias unstage='git reset HEAD'

Como interfaz gráfica suelo usar git-cola. Como visor de historial y de ramas no he llegado a encontrar ninguno que me guste demasiado, pero suelo usar el DAG que viene con git-cola o gitk que viene con la propia instalación de git.

Cuando trabajo con R, utilizo el panel de Git que incluye RStudio, ya que es lo más ágil.

  1. En este gist están todos los alias de bash que utilizo habitualmente. 

TL;DR: Una forma rápida de convertir la información principal de un fichero de issues exportado de Bitbucket a una tabla es usando el siguiente comando:

in2csv -f json -k issues archivo_exportado.json > tabla_salida.csv

Desde Bitbucket se pueden exportar los “issues” a un archivo json que guarda todos los datos relacionados con los mismos: contenido, comentarios, adjuntos, versiones, logs, etc. Aunque es un formato 1 muy completo, que permite exportar e importar cómodamente entre repositorios git, no es lo más cómodo para ser leido por personas (es lo que tiene el json, muy fácilmente procesable por máquinas, pero aunque legible por humanos, no es especialmente amigable).

A veces es útil poder visualizarlos en un formato más cómodo, para, por ejemplo, poder trabajarlos en el marco de la gestión de proyectos con personas que no trabajen habitualmente con código.

Una forma rápida de extraer parte de la información es a través del comando in2csv del paquete 2 csvkit. En este caso, nos quedaríamos con las características principales (estatus, prioridad, tipo, titulo y contenido, usuario que reporta, etc) y se quedarían fuera comentarios, adjuntos y otras informaciones.

En primer lugar hay que descomprimir el archivo que se genera al exportar desde Bitbucket y quedarse con el fichero llamado db-1.0.json o similar.

in2csv -k issues archivo_exportado.json > tabla_salida.csv

Tras el parámetro -k hay que indicar la clave “top-level” que se quiere extraer y es obligatorio si el JSON contiene más de una de estas claves. En nuestro caso, las claves son:

  • issues,
  • comments,
  • attachments,
  • logs,
  • meta,
  • components,
  • milestones
  • versions
  1. En esta página se puede encontrar una descripción del formato. 

  2. csvkit es un conjunto de herramientas de línea de comandos, escritas en Python, para trabajar con ficheros CSV. 

TL; DR

Cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería.

La variable que desaparecía

El otro día trabajando con un script en bash me volví un poco loco con una variable que modificaba dentro de un bucle while y que luego parecía no guardar su valor una vez terminado el bucle. Como era un comportamiento que para nada esperaba me costó lo mio dar con el problema. No era un problema del bucle, si no de que éste formaba parte de una tubería (pipe):

var1=0
echo $VARIABLE1 | 
while read task; do
  # cuerpo del bucle
  var1=2
  # ...
done
echo "$var1"


> 0

Efectivamente, cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería.

En esta web se puede leer una descripción detallada de este comportamiento, qué sucede en las diferentes versiones de shell, así como diferentes maneras de sortearlo.

De las propuestas, la solución que decidí adoptar en mi caso fue el agrupamiento de comandos (Command grouping) así:

var1=0
 
echo $VARIABLE1 |
{ 
  while read task; do
    # cuerpo del bucle
    var1=2
    # ...
  done
  echo "$var1"
}

> 2

Que, como explican en la página, no altera para nada el tema de la subshell, pero como en este caso no necesitaba reutilizar nada de lo que allí había en el resto del código, resulta una solución suficiente y rápida de aplicar.

De paso, he descubierto esta página que parece que va a ser una referencia útil a la que volver de vez en cuando.

Fuente:

BashFAQ