[ GIT ] Inconsistencias en archivos remotos y locales

Cuando utilizamos git pull origin master internamente se ejecutan dos comandos: `git fetch` y git merge.

El primer comando git fetch origin master descarga el contenido de la rama (branch) master del repositorio origin Mientras, el comando git merge junta los archivos descargados con la rama master local. Es muy frequente que tengamos algunos archivos differentes a los del repositorio remoto y a la hora de hacer el mergese presenten inconsistencias entre el repositorio remoto y el local.

La forma más común de corregir esto es editando el archivo con problemas (usar git statussobre la raíz del repositorio) y seleccionar la versión que necesitemos, es decir, entre la version remota y la local. Git automaticamente añade las dos versiones en el archivo aludido concatenado las líneas de texto difentes entre las dos versiones. Estas diferencias son fácilmente visibles por que git añade adicionalmente las líneas >>>>[hash commit remoto] para las diferencias provenientes del repositorio remoto, y >>>HEAD para la version local. Ambas versiones están separadas por los símbolos =======. Recuerda, estas modificaciones son automáticamente añadidas en el archivo que presenta el problema.

Una vez que hemos borrado la versión que no queremos proseguimos a salvar el archivo, añadirlo al Stage de git (con git add [archivo problematico]) y luego hacemos un commit (git commit -m "alguna mensaje").

Arreglar inconsitencias en archivos grandes

Algunas veces editar manualmente cada archivo problemático puede ser engorroso o simplemente ya sabemos que alguna versión es mejor que la otra. Por ejemplo la versión local (nuestra versión) puede estar más actualizada o la versión remota (la del ellos) puede ser más estable.

En versiones git > 1.6.1 podemos utilizar la opción --ours (nuestra versión) o --theirs (la de ellos) para seleccionar si queremos mantener la versión local o la versión remota (respectivamente). Esta opción sólo es válida para el comando git checkout [archivo problemático] . De esta manera podemos hacer:

git checkout --ours [archivo problemático]

Para quedarnos con nuestra versión.

git checkout --theirs [archivo problemático]

Para quedarnos con la versión remota.

¿ Cómo crear paquetes de R ?

Objetivos

Queremos hacer un paquete (i.e. un conjunto de funciones, datos y documentación de R). El paquete debe ser accesible desde internet de la manera más eficiente posible. Se deben seguir las mejores prácticas de la comunidad, incluir los datos a utilizar, ejemplos , etc

Crear un repositorio Git

Lo primero que tenemos que hacer es crear un repositorio GIT. Hay muchos tutoriales ahí afuera para hacer repositorios. Usa el google.

Supongamos pues, que tenemos uno ya hecho. En mi caso, hice un fork de CARBayes (Duncan Lee) y lo puse en mi repositorio público en Github (https://github.com/molgor/CARBayeSDM.git )

Fijensé como esta la estructura de los archivos.

Paquetes necesarios

install.packages("devtools")
library("devtools")
install.packages("roxygen2")
library("roxygen2")

 

Devtools permite instalar paquetes desde repositorios GIT además de otras utilidades para desarrolladores. Roxygen es una librería crear documentación en R. Su nombre viene de la popular applicación Doxygen para crear documentación.

Inicializar la estructura

Podemos utilizar la función ‘create_package(Nombre_de_paquete) ‘ para crear una estructura de directorios.

setwd('ruta del repositorio')
create_package('mi_paquete')

La estructura quedará de la siguiente manera :

  • R (Carpeta donde se guardará el código de R)
  • man (Donde se guardará la documentación)
  • DESCRIPTION (archivo Readme que contiene la descripción del paquete)
  • NAMESPACE (configuración de las funciones definidas por el paquete)

 

Escribir función con documentación

Vamos a escribir las funciones dentro de la carpeta R. Aquí definiremos las funciones pero primero pondremos la documentación (descripción de cada función al comienzo del archivo). Ve el siguiente ejemplo. El archivo se llama: *MyTestingFunction.R* [ Disculpa por escribirla en inglés, ya quedará en ustedes traducirla] .

#' An example for writing a function in R using Roxygen (e.g. a variant of Doxygen for
#' R) 
#' Well, this function is for writing stuff, I suppose that I need to write here the
#' pourpose of the function.
#' @param something Something to put
#' @keywords Tests, examples, many
#' @export
#' @examples
#' test_function()

test_function  <- function(something=TRUE) {
  if(something==TRUE) {
   c = 'Something is True'
  return(c)
  }
  else {
    c = 'Something is different from TRUE'
    return(c)
  }
}

Compilar documentación e instalar

Para compilar la documentación basta con ejecutar:

document()

 

Para instalar todo:

setwd("..")
install("mi_paquete")

Usando repositorio en Github

Si se opta por esta opción se puede instalar directamente usando la función:

install_github('mi_paquete','usuario_de_github')

Listo! A desarrollar

Ahora podemos desarrollar paquetes de R, subirlos a github y compartirlos con todos nuestros colegas.

Colabora y no seas culer@!
Este post está basado en el ejemplo de Hillary Parker .

Solucionar: IO Error ‘[Errno 28] No space left on device’

Este error es frecuente al utilizar librerías de Python de multiprocesamiento ‘joblib’ con una cantidad considerable de datos.

Diagnostico

El problema es que la memoria compartida ‘/dev/shm’(usualmente menor que la memoria RAM) se satura.

Para corregirlo tendremos que cambiar la variable de entorno: JOBLIB_TEMP_FOLDER a un directorio que con mayor capacidad. (e.g. /tmp)

Esto puede hacerse directamente en iPython o Jupyter con:

%env JOBLIB_TEMP_FOLDER=/tmp

O agregandola en el shell con:

$ export JOBLIB_TEMP_FOLDER=/tmp