remota - git push example
Usando git, ¿cómo ignoro un archivo en una rama pero lo tengo comprometido en otra rama? (8)
Tengo un proyecto que implementaré 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 participé mucho).
Me gustaría poner el código fuente para él 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 archivo .gitignore
para mantenerlos fuera de mi repositorio.
Sin embargo, despliego a Heroku usando git push heroku
. Los archivos mp3 deben estar presentes en la rama que presiono a Heroku para que se desplieguen.
Idealmente, me gustaría .gitignore
los archivos mp3 en mi rama principal local para que cuando lo presione a GitHub, los mp3 no estén incluidos. Luego mantendría una sucursal de producción local que tiene los mp3 comprometidos en lugar de ignorados. Para implementar, fusionaría maestro en producción y luego impulsaría la rama de producción a Heroku.
No puedo hacer que esto funcione bien.
Aquí hay un ejemplo de lo que intento 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 se ignora en mi rama principal, 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 principal, 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 se ignoren los archivos en una rama, así que cuando presiono para GitHub, tampoco se presionan. 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 un comando remoto), pero cuando cambio a la rama con los archivos ingresados, y luego de vuelta a la rama con los archivos ignorados, los archivos desaparecen.
Esta solución parece funcionar solo para ciertas versiones parcheadas de git. Vea una nueva respuesta que apunta a soluciones alternativas y otra respuesta y comentarios posteriores para una sugerencia de qué versiones pueden funcionar.
Escribí una publicación de blog sobre cómo usar efectivamente el archivo de exclusión para diferentes ramas, como una para el github público y otra para el despliegue de heroku.
Aquí está el rápido y sucio:
$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing
luego en el archivo .git / config agrega estas líneas:
[core]
excludesfile = +info/exclude
[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing
Ahora todas las cosas ignoradas globales están en el archivo de info/exclude
y la rama específica está en la info/exclude_from_public_viewing
¡Espero que ayude!
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
1. Resumen
- Uso Travis CI para deploying ( admite la implementación de Heroku )
Yo agrego a mi
.travis.yml
:before_deploy: - mv misc/.gitignore .gitignore
Donde hay una carpeta diferente, contiene otro
.gitignore
.mv
archivo de movimiento de UNIX ; sobrescribir, si el archivo ya existe.
Cuando Travis CI implementa un proyecto, Travis CI no empuja a desplegar archivos y carpetas de proveedores , que ignoran en misc/.gitignore
(no en el .gitignore
original de las fuentes).
2. Limitaciones
- Esta respuesta puede no ser adecuada para todas las condiciones del autor. Pero esta respuesta responde a la pregunta "Usando git, ¿cómo ignoro un archivo en una rama pero lo tengo comprometido en otra rama?"
- No soy usuario de Heroku, mis ejemplos para GitHub , no para Heroku. Los datos de esta respuesta me funcionan en GitHub, pero pueden no funcionar en Heroku.
3. Relevancia
Esta respuesta es relevante para abril de 2018. En el futuro, los datos de esta respuesta pueden estar obsoletos.
4. Demostración
Ejemplo de implementación exitosa .
4.1. Tarea
Despliego mi proyecto desde la rama src a la rama dest del mismo repositorio.
Quiero ese archivo PaletteMira.suricate-profile
:
- Máquina local: existe para todas las ramas,
- rama remota src - no existe,
- Dest rama remota - existe.
Si entendí correctamente al autor de la pregunta, él tiene una tarea similar.
4.2. src
rama de fuentes - SashaYAML .
Parte de .travis.yml
:
before_deploy:
- mv misc/.gitignore .gitignore
deploy:
provider: pages
on:
branch: SashaYAML
keep-history: true
skip-cleanup: true
target-branch: SashaDevelop
repo: Kristinita/PaletteMira
github-token: $GITHUB_TOKEN
committer-from-gh: true
project-name: PaletteMira
verbose: true
Parte de .gitignore
:
*.sublime-snippet
*.suricate-profile
Parte de misc/.gitignore
*.sublime-snippet
*.suricate-profile
no en misc/.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
:
*.sublime-snippet
*.suricate-profile
no en misc/.gitignore
.
PaletteMira.suricate-profile
existe para esta rama de remotely y local.
4.4. pasos para reproducir
Habilito el repositorio PaletteMira GitHub para Travis CI → Configuré la variable de entorno $GITHUB_TOKEN
con valor - mi token GitHub → $GITHUB_TOKEN
cualquier confirmación a mi rama src.
Si no hay errores, debo obtener el comportamiento esperado .
¿Has intentado que .gitignore sea diferente en tu rama?
Debería poder ignorar lo que desea según la sucursal en la que se encuentre, siempre que no se rastreen los archivos en esa sucursal.
¿Puedes comprometerte y empujar por parte de Heroku?
por ejemplo, agregue el audio, empújelos a github y dentro de heroku, elimine los archivos en la copia de trabajo en Heroku. Elimine el audio del repositorio, pero no del disco, y luego vuelva a colocar el cambio en github.
Digamos que queremos ignorar la carpeta de build
de todas las otras ramas, excepto la de production
. Como queremos impulsar la carpeta de build
en producción.
1) No incluir build
en .gitignore. Si lo haces, siempre será ignorado para todas las ramas.
2) Cree un archivo exclude_from_public_viewing
dentro de la carpeta ./.git/info
(esta carpeta ya existe) touch ./.git/info/exclude_from_public_viewing
3) Dentro de exclude_from_public_viewing
escribe una línea (ya que estás tratando de ignorar la build
para todas las ramas). !build
4) Hay un archivo existente .git/info/exclude
. Necesitamos agregar la siguiente línea en él.
build
Queremos ignorar la carpeta de build
pero no la hemos agregado en .gitignore. Entonces, ¿cómo sabrá git qué ignorar? La respuesta es que lo estamos agregando para exclude
archivo y pasarlo condicionalmente a la git config
5) Ahora tenemos que desmarcar condicionalmente la carpeta de build
para la rama de production
. para hacer eso realiza lo siguiente
6) Hay un archivo existente llamado ./.git/config
. Necesitamos agregar lo siguiente:
a) excludesfile = +info/exclude
continuación [core]
[core]
excludesfile = +info/exclude
b) Cree una nueva sección al final de ./.git/config
como
[branch "production"]
excludesfile = +info/exclude_from_public_viewing
Solución 2
Hay una solución alternativa inteligente. Digamos que desea agregar build/
carpeta en el brunch de production
e ignorarlo en todas las demás sucursales.
1) gitignore
a tu archivo de gitignore
.
2) En brunch de producción, al hacer git add, forzar agregar carpeta de build
git add -f --all build/
Github ahora es compatible con el almacenamiento de archivos grandes, ver más aquí https://git-lfs.github.com/
Recomiendo encarecidamente considerar poner esos archivos MP3 en S3. Tenerlos como parte de tu empuje Heroku (y por lo tanto, parte de tu babosa Heroku) ralentizará en gran medida el tiempo de inicio de tu dyno. Como Heroku usa EC2, si los archivos están en S3 y su aplicación solo accede a ellos (si los usuarios no están directamente vinculados a S3), ni siquiera pagará los cargos de ancho de banda, solo el cargo por almacenar 50MB.
Pista importante : la respuesta aceptada por Cognition.Mind no funciona (ya hace varios años, o tal vez para las versiones de vanit de git); ver los comentarios Una respuesta válida y una solución alternativa se pueden encontrar aquí:
https://.com/a/29583813/2157640
Otra solución alternativa (que funciona para mi problema en particular, pero exige operaciones manuales ocultas o implementación de un enlace) sería git stash -u -a
. Esto es tedioso cuando las diferencias son grandes.
Y finalmente, la solución con la que ahora estoy trabajando es haber bifurcado mi máquina virtual en la que tenemos nuestro entorno de desarrollo y configurar info/excludes
para la sucursal, respectivamente, eliminando los archivos / carpetas ofensivos y no comprometidos.