Tengo un proyecto que estoy implementando en Heroku . El árbol de código fuente incluye un montón de archivos mp3 (el sitio web será para un proyecto de grabación en el que estuve muy involucrado).
Me gustaría poner el código fuente en GitHub , pero GitHub tiene un límite de 300 MB en sus cuentas gratuitas. No quiero usar 50 MB de mi límite en un montón de archivos mp3. Obviamente, podría agregarlos al .gitignore
archivo para mantenerlos fuera de mi repositorio.
Sin embargo, lo uso en Heroku usando git push heroku
. Los archivos mp3 deben estar presentes en la rama que envío a Heroku para que se implementen.
Idealmente, me gustaría tener .gitignore
los archivos mp3 en mi rama maestra local para que cuando lo transfiera a GitHub, los mp3 no estén incluidos. Luego mantendría una rama de producción local que tiene los mp3 comprometidos en lugar de ignorados. Para implementar, fusionaría master en producción y luego empujaría la rama de producción a Heroku.
No puedo hacer que esto funcione bien.
Aquí hay un ejemplo de lo que estoy tratando de hacer ...
$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored
En este punto, Foo.ignored es ignorado en mi rama maestra, pero todavía está presente, por lo que mi proyecto puede usarlo.
$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
Ahora tengo una rama con estos archivos comprometidos, como quiero. Sin embargo, cuando vuelvo a mi rama maestra, Foo.ignored se ha ido.
¿Alguien tiene alguna sugerencia para una mejor manera de configurar esto?
Editar: solo para aclarar, quiero que los archivos mp3 estén presentes en ambas ramas para que cuando ejecute el sitio localmente (usando cualquiera de las ramas) el sitio funcione. Solo quiero que los archivos se ignoren en una rama, por lo que cuando presiono a GitHub no se presionan también. Por lo general, .gitignore funciona bien para este tipo de cosas (es decir, mantener una copia local de un archivo que no se incluye en una inserción a un control remoto), pero cuando cambio a la rama con los archivos registrados y luego vuelvo a rama con los archivos ignorados, los archivos desaparecen.
Respuestas:
Escribí una publicación de blog sobre cómo usar efectivamente las
excludesfile
diferentes ramas, como una para github público y otra para la implementación de heroku.Aquí está lo rápido y sucio:
luego en el archivo .git / config agregue estas líneas:
Ahora todo el material de ignorar global está en el
info/exclude
archivo y la rama específica está en elinfo/exclude_from_public_viewing
¡Espero que ayude!
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
fuente
git init
, ...) y la versión de Git que utilizó?Sugerencia importante : la respuesta aceptada por Cognition.Mind ya no funciona (desde hace varios años, o tal vez para versiones de vainilla de git); ver los comentarios Puede encontrar una respuesta válida y una solución alternativa aquí:
https://stackoverflow.com/a/29583813/2157640
Sería otra solución alternativa (trabajar para mi problema particular, pero exigir operaciones manuales de almacenamiento o la implementación de un gancho)
git stash -u -a
. Esto es tedioso cuando las diferencias son grandes.Y finalmente, la solución con la que ahora estoy yendo es bifurcar mi VM en la que tenemos nuestro entorno de desarrollo y configurarla de manera
info/excludes
apropiada para la rama, eliminando respectivamente los archivos / carpetas ofensivos y no comprometidos.fuente
Recomiendo encarecidamente considerar poner esos archivos MP3 en S3. Hacer que sean parte de su empuje Heroku (y, por lo tanto, parte de su babosa Heroku) disminuirá en gran medida el tiempo de inicio de su dinamómetro. Dado que Heroku usa EC2, si los archivos están en S3 y solo su aplicación accede a ellos (si los usuarios no están directamente vinculados a S3), ni siquiera pagará ningún cargo por ancho de banda, solo el cargo por almacenar 50 MB.
fuente
Digamos que queremos ignorar la
build
carpeta de todas las demás ramas, excepto laproduction
rama. Como queremos empujar labuild
carpeta en producción.1) No incluir
build
en .gitignore. Si lo hace, siempre se ignorará para todas las ramas.2) Crear un archivo
exclude_from_public_viewing
dentro de la./.git/info
carpeta (Esta carpeta ya existe)touch ./.git/info/exclude_from_public_viewing
3) En el interior,
exclude_from_public_viewing
escriba una línea (como está tratando de ignorarbuild
todas las ramas).!build
4) Hay un archivo existente
.git/info/exclude
. Necesitamos agregar la siguiente línea en él.Queremos ignorar la
build
carpeta pero no la hemos agregado en .gitignore. Entonces, ¿cómo git sabrá qué ignorar? La respuesta es que lo estamos agregando alexclude
archivo y condicionalmente pasando ese archivo agit config
5) Ahora tenemos que ignorar condicionalmente la
build
carpeta de laproduction
rama. para hacer eso realizar siguiente6) Hay un archivo existente llamado
./.git/config
que necesitamos agregar a continuación:a) a
excludesfile = +info/exclude
continuación[core]
b) Crear una nueva sección al final de
./.git/config
asHay una solución alternativa inteligente. Digamos que desea agregar una
build/
carpeta en laproduction
rama e ignorarla en todas las demás ramas.1) Agréguelo a su
gitignore
archivo.2) En la rama de producción, mientras lo hace
git add
, forzar agregarbuild
carpeta:git add -f --all build/
fuente
branch.<name>.excludesfile
git (¿ya?), Solo paracore.excludesfile
, y mis propias pruebas parecían afirmar esto.git version 2.7.4 (Apple Git-66)
y no lo he usadobranch.<name>.excludesfile
en mi solución.¿Has intentado que .gitignore sea diferente en tu rama?
Debería poder ignorar lo que desea en función de la rama en la que se encuentre, siempre que no se rastreen los archivos en esa rama.
fuente
1. Resumen
Agrego a mi
.travis.yml
:Donde
misc
: cualquier carpeta contiene otra.gitignore
.mv
Comando UNIX mover archivo; sobrescribir, si el archivo ya existe.Cuando el proyecto de implementación de Travis CI, Travis CI no presionará para implementar archivos y carpetas de proveedores , que se ignoran
misc/.gitignore
(no en el original.gitignore
de las fuentes).2. Limitaciones
3. Relevancia
Esta respuesta es relevante para abril de 2018. En el futuro, los datos de esta respuesta pueden quedar obsoletos.
4. Demostración
Mi verdadero proyecto .
Ejemplo de implementación exitosa .
4.1. Tarea
Implemento mi proyecto desde la rama src a la rama dest del mismo repositorio.
Quiero ese archivo
PaletteMira.suricate-profile
:Si entendí correctamente al autor de la pregunta, él tiene una tarea similar.
4.2. src
sucursal de fuentes - SashaYAML .
Parte de
.travis.yml
:Parte de
.gitignore
:Parte de
misc/.gitignore
*.suricate-profile
no enmisc/.gitignore
.PaletteMira.suricate-profile
no existe en esta rama de forma remota, sino que existe localmente.4.3. dest
sucursal de destino - SashaDevelop
Parte de
.gitignore
:*.suricate-profile
no enmisc/.gitignore
.PaletteMira.suricate-profile
existe para esta sucursal de forma remota y local.4.4. pasos para reproducir
Habilito el repositorio PaletteMira GitHub para Travis CI → Establezco la variable de entorno
$GITHUB_TOKEN
con valor: mi token GitHub → Realizo cualquier confirmación en mi rama src.Si no hay errores, debo obtener el comportamiento esperado .
fuente
¿Puedes cometer y empujar desde Heroku?
Por ejemplo, agregue el audio, póngalos en github y en heroku, elimine los archivos de la copia de trabajo en Heroku. Elimine el audio del repositorio pero no del disco, luego empuje ese cambio nuevamente a github.
fuente
Github ahora tiene soporte para el almacenamiento de archivos grandes, vea más aquí https://git-lfs.github.com/
fuente