Organizando las ramas en carpetas

Si en el momento de crear una rama utilizas como nombre una ruta, como por ejemplo “mi-carpeta-de-ramas/nombre-de-rama”, verás que en la carpeta .git/refs/heads de tu repositorio se creará una subcarpeta “mi-carpeta-de-ramas”. Dentro de la misma verás el fichero “nombre-de-rama” con la referencia. Es decir, git convierte la cadena con formato de ruta que pasamos como argumento en una estructura real de carpetas.

Esta forma de crear ramas soporta subcarpetas, es decir, si creamos una rama que se llame carpeta1/carpeta2/mirama:

$ git checkout -b carpeta1/carpeta2/mirama

git creará el fichero .git/refs/heads/carpeta1/carpeta2/mirama con la referencia.

¿Y cómo muestra SourceTree las ramas creadas de esta manera?

Organizando las ramas en carpetas

Esta forma de clasificar las ramas en carpetas es especialmente útil cuando trabajamos con ramas para hacer hotfixes, corregir bugs o desarrollar funcionalidades organizadas en historias de usuario.

Desde la interfaz de línea de comandos, así es como veríamos las ramas:

$ git branch -av
   carpeta1/carpeta2/mirama 4604003 Introduciendo el texto definitivo
   develop                  b7bd517 Merge branch ‘feature-H-1’ into develop
*  feature/H-2              4604003 Introduciendo el text definitive
   master                   87ee184 Initial commit

Si quisiésemos ver sólo las ramas feature, podemos usar la opción –list:

$ git branch --list feature*
feature/H-2

Para borrar la rama, usamos el comando git-branch con la ruta completa a la rama:

$ git branch -D carpeta1/carpeta2/mirama

Un truco muy sencillo que nos ayuda a organizar las ramas un poco mejor, especialmente útil si estáis usando SourceTree.

4 pensamientos en “Organizando las ramas en carpetas

  1. Rubén

    Hola Alfonso, en primer lugar déjame felicitarte por el blog es un verdadero repositorio de lujo en cuanto a lo que información y documentación de Git respecta.

    Te quería hacer una pregunta un tanto concreta de Git, y no sé bien donde dejártela, lo hago por aquí para que cuando lo resolvamos los lectores puedan aprovechar el feedback.

    Verás, estoy en un escenario bastante común. Tengo varias ramas: develop, uat, master… de un website. Entonces tengo un fichero settings.php en el que, entre otras cosas, se guardan los datos de conexión a la Base de Datos.

    Quiero versionar este fichero, pero necesitaría que cada entorno mantuviera su versión y al hacer merges entre ramas no se “machacara”. El gitignore no me vale, porque pierdo el versionado del fichero.

    He investigado un poco y parece que los gitatributte pueden servir: http://librosweb.es/pro_git/capitulo_7/atributos_de_git.html pero no acabo de conseguir lo que quiero, y cuando voy a hacer un merge de develop a uat me detecta diferencias y me obliga a comitear cambios en el settings antes de mergear.

    Mi fichero .gitattribute contiene sólo esto: sites/*/settings*.php merge=ours

    Por lo general uso SourceTree pero no tengo problema moviéndome por terminal, podrías echarme algo de luz con el asunto?

    Muchas gracias!

    Responder
    1. Rubén

      Finalmente lo he conseguido en parte siguiendo tu consejo, simplificando el .gitattributes poniendo el fichero en el mismo directorio que el settings.php y para no pelearme con rutas, ya que es un fichero muy concreto lo he dejado así: settings.php merge=ours

      Sin embargo no ha sido suficiente y he tenido que configurar un driver de merge, de esto ayer no tenía ni conocimiento 😛

      Poniendo esto en el .git/config


      [merge "ours"]
      name = "Keep ours merge"
      driver = true

      Ha empezado a funcionar, supongo que tiene sentido que sin esto “no entiende” la palabra “ours”, pero pensaba que el “ours” y el “theirs” eran palabras reservadas o algo, supongo que SourceTree nos abstrae un poco de esto 😛

      Gracias por tu ayuda!

      Responder
      1. alfonso

        Hola Rubén:

        Copio aquí la respuesta que te di ayer por twitter a toda prisa:

        Hola. Creo que el problema puede estar en los * de la ruta la fichero. Si la expansión funciona como en .gitignore quizás ese sea el problema. Prueba a meter un fichero .gitattributes en la carpeta en la que están los settings (sites/CARPETA) y dentro de ese .gitattributes pon

        settings*.php, merge=ours

        Así eleminas el * de la ruta. Otra opción es que pruebes con sites/**/settings*.php.

        Responder
      2. admin

        Existe otra forma de hacer esto que no requiere el uso de atributos. Consiste en lo siguiente:

        • Creas un fichero settings_ref.php con la configuración de referencia
        • Incluyes este fichero en el repositorio
        • Incluyes settings.php en .gitignore

        Cuando alguien clona el repositorio, debe copiar settings_ref.php a settings.php y proceder a configurar el proyecto. De esta forma puedes tener tantos clones como necesites (producción, testing, pre-producción, tu máquina, la de tus compañeros de equipo, etc) cada uno con su settings.php. Toda configuración que necesite ser guardada en el repositorio se almacena en settings_ref.php.

        De esta forma, además, evitamos que por error se sobreescriba el settings.php al estar incluido en el .gitignore.

        Y gracias por la información que has puesto antes sobre el driver, es la primera vez que lo veo.

        Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *