2010-03-19 11 views
8

¿Es posible excluir archivos específicos (* .ai, * .psd) al empujar a ciertos repositorios con Git?excluir archivos específicos al empujar a un repositorio Git específica

Mi necesidad viene de tratar de usar Git tanto para el control de versiones y el despliegue de Heroku. Si incluyo mis activos gráficos en la implementación, el tamaño de la babosa es mayor de lo deseado. Sin embargo, necesito incluir todos los archivos del proyecto en mi repositorio principal github.

+0

No hay manera simple de hacer esto. Tal vez esta respuesta ayude: http://stackoverflow.com/questions/2454661/heroku-and-github-integration-how-to-structure-the-project/2454778#2454778 – mckeed

+0

Gracias por el comentario. Supongo que tendré que encontrar un trabajo (hack) alrededor. –

Respuesta

12

La manera fácil de resolver su problema real es crear un archivo .slugignore en la raíz del repositorio que enumera los archivos que no se deben empaquetar en la barra.

+0

¡increíble! esto me ayuda mucho gracias – stephenmurdoch

+1

¡Gracias! ¡Eso es exactamente lo que necesitaba! –

4

Puede mantener una segunda rama para el despliegue de Heroku, que no contiene ninguno de esos archivos, pero todavía se funde de maestro. (Por supuesto, tendrás que encontrar un sistema para resolver los conflictos de fusión que obtienes cuando modificas los archivos .ai y .psd en el maestro).

Lo específico que pregunta es imposible, por la simple razón de que cuando se empuja, se transfieren los commit exactos de un repositorio a otro, y dos commits que no tienen el mismo árbol son por definición commits diferentes.

Sugerencia: Las versiones más recientes de git tienen una opción --porcelain para git status que proporcionará información fácil de analizar como "M archivo1" "archivo DU2" (modificado y no modificado/eliminado por nosotros, respectivamente). Se podría escribir un envoltorio git-fusión para su sucursal de despliegue que trata de la fusión, y automáticamente se limpia los conflictos esperados:

git checkout deploy 
if ! git merge master; then 
    git rm $(git status --porcelain | awk '/^DU/ {print $NF}') 
fi 

(La razón por la que imprimí $NF en lugar de $2 es que si cambió el nombre del archivo, se' Se verá como "DU original_name -> new_name", y la copia colocada en el árbol de trabajo será new_name, no original_name.)

Por supuesto, la secuencia de comandos podría volverse más compleja si tu situación es - podrías buscar solo ciertas extensiones (agréguelas al patrón de limitación de awk), o incluso capture toda la salida en un script de perl para que pueda hacer fácilmente una lógica más sofisticada ...

+0

¿Puedo tener archivos de exclusión separados para diferentes ramas? ¿Tendré que crear dos proyectos en mi máquina local? Gracias. –

+0

No necesita dos repositorios para dos ramas: ese es uno de los beneficios principales de usar algo como git. La ramificación y la fusión son realmente fáciles. Y sí, puedes tener diferentes .gitignores para diferentes ramas (¡después de todo, es un archivo rastreado dentro del repositorio!), Pero recuerda que los gitignores no son para archivos que ya están rastreados, son para ayudarte a evitar que te comprometas cosas (como objetos de construcción) que no están ya comprometidas. – Cascabel

+0

Ah, OK, tendré que leer un poco más sobre GIT (soy un usuario de SVN que intenta cambiar). Gracias por el consejo. –

3

No hay una manera directa fácil de hacerlo. Es ciertamente manejable, pero con mucho dolor (Git no fue diseñado para hacer esto).

Sería más fácil, probablemente, si le preguntas a Heroku para proporcionar una forma de excluir algunos archivos de la despliegue.

+0

Sí, me encanta la solución de hosting en general, excepto esa característica. Intentaré enviarle una nota a los creadores y veré si tienen alguna funcionalidad en el camino. –

+0

Parece que esto ya es posible, según la respuesta de John Topley. – hasen

Cuestiones relacionadas