git log --before={`date "+%Y-%m-01"`} --after={`date --date='-1 month' "+%Y-%m-01"`} --author="`git config user.name`" --reverse --pretty=format:"%cd  %h  %s" --date=short

Fuentes:

Tenía un respaldo de mis archivos en una carpeta y quería restaurar los archivos incluyendo carpetas y archivos ocultos (.git, .svn, etc), excepto las carpetas del sistema como .gnome2, .gconf, .compiz, .local; ni archivos como .bashrc, .bash_history, .profile, etc. Estas carpetas y archivos están situados en la raíz del directorio de mi usuario.

Para poder excluirlas de la sincronización basta con la siguiente línea

rsync -av –exclude ‘/.‘ –exclude ‘/./’ /mnt/backup/home/cirovladimir/ /home/cirovladimir/

La parte importante es la diagonal inicial en los patrones exclude, el primero le indica que excluya todos los archivos que comienzan con un punto situados en la raíz del directorio, y el segundo le indica las carpetas. También es importante que incluyas la diagonal al final del directorio ‘origen’ y al final del direcotrio ‘destino’.

De esta forma omitirá todos los archivos y carpetas ocultas del primer nivel (raíz) pero sincronizará los archivos y carpetas ocultas que se encuentren en los subdirectorios.

Fuente:
http://programmersnotebook.wordpress.com/2010/03/20/rsync-and-exclude-from/

De acuerdo a esta pregunta en stackoverflow, existen 2 formas principales de lograr esto. Una es utilizando submodules y la otra haciendo un “subtree merge”. La primera es para proyectos realacionados pero que siguen un desarrollo independiente el uno del otro. Y el segundo, que es el que vamos a utilizar, es para integrar el código de un proyecto dentro de otro.

Pues lo primero es agregar como remoto el proyecto que queremos agregar

   git remote add -f panda git://github.com/TekNoLogic/Panda.git

después hacemos el subtree merge de la siguiente forma

   git merge -s ours --no-commit panda/master
   git read-tree --prefix=panda/ -u panda/master
   git commit -m "Subtree merged in panda"

Si el código que quieres integrar esta en una subcarpeta puedes hacer lo siguiente

   git read-tree --prefix=cork2/submodule -u cork/master:src/main/submodule
   git commit -m "Subtree merged in cork2/modules"

Fuentes:

https://help.github.com/articles/working-with-subtree-merge
http://nuclearsquid.com/writings/subtree-merging-and-you/
http://stackoverflow.com/a/1426163/961652

La forma más fácil de migrar un repositorio de subversion a git, es utilizar la herramienta svn2git.

Nuestro caso era el #4

The svn repo is NOT in standard layout and has no trunk, branches, or tags at the root level of the repo. Instead the root level of the repo is equivalent to the trunk and there are no tags or branches.

así que utilizamos el siguiente comando, con una pequeña modificación para tomar en cuenta los autores

svn2git http://svn.example.com/path/to/repo --rootistrunk --authors ~/authors.txt
Nota: Recientemente intenté migrar otro repositorio pero el comando anterior me arrojó el siguiente error

git svn init --prefix=svn/ --no-metadata --trunk=svn://svn.repo/project/
Initialized empty Git repository in /home/cirovladimir/project/.git/
E: 'svn:/svn.repo/project' is not a complete URL and a separate URL is not specified
para que funcione sólo sustituye el parámetro --rootistrunk por --trunk '/'

para crear el archivo de autores utilizamos el comando


svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > ~/authors.txt

y luego modificamos las líneas

jwilkins = jwilkins

por

jwilkins = John Albin Wilkins <johnalbin@example.com>

Fuentes:
http://john.albin.net/git/convert-subversion-to-git
https://github.com/nirvdrum/svn2git#readme

Si has configurado un servidor local necesitarás configurar al cliente con las llaves que generaste.

Lo único que tenemos que hacer es ejecutar el comando

ssh-add /ruta-a-tu-llave/mi-llave-rsa

nos debe pedir la contraseña (passphrase) de nuestra llave privada.

Con esto ya podríamos sincronizar nuestro repositorio con el servidor remoto

git pull origin master

o

git fetch origin master

Cuando reiniciemos nuestra máquina será necesario volver a ejecutar el comando ‘ssh-add’ e ingresar nuestra contraseña. Si quieres evitar esto, tendrías que remover la contraseña de la llave privada (lo cual no es recomendable) de la siguiente manera

ssh-keygen -p /ruta-a-tu-llave/mi-llave-rsa

ingresar tu calve anterior y dejar en blanco la nueva. Una vez hecho esto debes agregar la siguiente línea al archivo “~/.profile”

ssh-add /ruta-a-tu-llave/mi-llave-rsa &> /dev/null

este comando se ejecutará al iniciar tu sesión y ya no te pedirá el passphrase al intentar sincronizar.


Usuarios Windows

Para agregar tu llave privada en Git Bash, necesitas ejecutar los siguientes comandos.

Primero copiamos nuestra llave privada a la ubicación por default

cp /ruta/llave_privada_rsa ~/.ssh/id_rsa

con esto te pedirá la contraseña de tu llave privada cada vez que ejecutes un comando como “git fetch” (suponiendo que tenga clave).

Si no quieres estar tecleando tu contraseña cada vez, puedes utilizar un agente. Para ello, primero tenemos que levantar el servicio con el siguiente comando

eval `ssh-agent -s`

(notensé las comitas invertidas o backticks)

Una vez iniciado el agente, le pedimos que agregué nuestra llave

ssh-add

al invocarlo sin parámetros, utiliza la llave por default (~/.ssh/id_rsa)

Fuentes:
http://stackoverflow.com/questions/3466626/add-private-key-permanently-with-ssh-add-on-ubuntu
http://serverfault.com/questions/345103/public-key-authentication-ssh-asks-for-passphrase-after-rebooting-local-machin
http://winscp.net/eng/docs/faq_passphrase
http://stackoverflow.com/questions/112396/how-do-i-remove-the-passphrase-for-the-ssh-key-without-having-to-create-a-new-ke
http://stackoverflow.com/questions/4083079/how-to-run-git-ssh-authentication-agent

Para configurar un servidor de git local podemos seguir la guía oficial.
La guía nos muestra los pasos necesarios para acceder a un repositorio de git mediante ssh, que es la forma más común para acceder (leer y escribir) a un repositorio. Esto debido a la seguridad y eficiencia que ofrece el protocolo ssh. Puedes leer sobre los distintos protocolos (local, http[s], git, ssh) disponibles en git aquí.

Bueno, lo primero que necesitamos es tener un servidor de ssh

sudo apt-get install openssh-server

Luego tenemos que crear al usuario ‘git’. Yo especifiqué el directorio del usuario para que no me creara el directorio /home/git

sudo adduser --home /home/cirovladimir/Apps/git

nos va a pedir una contraseña y algunos datos, podemos dejar vacíos los demás campos.

Luego nos logeamos como el usuario git y creamos el directorio ‘.ssh/’

sudo su git
cd
mkdir .ssh

a continuación vamos a generar las llaves para nuestros usuarios

ssh keygen -t rsa -C 'usuario_1@gmail.com' -f usuario_1_rsa
ssh keygen -t rsa -C 'usuario_2@gmail.com' -f usuario_2_rsa

nos va a generar un par de llaves para cada usuario, una pública (extensión .pub) y una privada

Hay que agregar las llaves públicas al archivo .ssh/authorized_keys

cat usuario_1_rsa.pub >> .ssh/authorized_keys
cat usuario_2_rsa.pub >> .ssh/authorized_keys

Ahora vamos a iniciar un repositorio para nuestro proyecto

mkdir -p repos/proyecto.git
cd repos/proyecto.git
git --bare init

cerramos la sesión del usuario git

exit

si ya tenemos un repositorio local que queremos sincronizar con el servidor que acabamos de configurar, hacemos lo siguiente

cd miproyecto
git remote add origin git@localhost:repos/proyecto.git
git push origin master

en este caso el servidor es local, si lo configuras en otra máquina puedes sustituir localhost por el nombre de la máquina o su ip.

Si al ejecutar el ‘push’ te arroja un error parecido al siguiente

Error: Agent admitted failure to sign

lo puedes resolver con el comando

ssh-add /ruta/usuario1

y te va a pedir el passphrase que utilizaste cuando generaste la llave.

Fuentes:
http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server
http://git-scm.com/book/ch4-1.html
https://help.github.com/articles/generating-ssh-keys
https://help.github.com/articles/error-agent-admitted-failure-to-sign

git – saltos de línea CRLF

Si en tu equipo de trabajo utilizan computadoras con Windows y Linux (o Mac) para desarrollar, seguramente tendrán un problema con los saltos de línea. Git resuelve este problema mediante el parámetro de configuración ‘core.autocrlf’.

En las computadoras con Windows establece este parámetro en ‘true’ mediante el comando

git config –global core.autocrlf true

En las computadoras con Linux (Mac) debe ser falso (default).

CP-1252

Otro problema que se nos presentó, debido a este ambiente heterogéneo, fue la codificación de los proyectos. La codificacioón por default en Windows (en español) es CP-1252 mientras que Linux utiliza UTF-8. Para que nuestros proyectos Maven puedan ser compilados en ambas plataformas, es necesario agregar el siguiente parámetro de configuración al archivo pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Fuentes:
git book
http://stackoverflow.com/questions/9976616/maven-platform-encoding