repositorio remota rama origin example eliminar ejemplo comandos cambiar git gitignore

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

  1. Uso Travis CI para deploying ( admite la implementación de Heroku )
  2. 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

  1. 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?"
  2. 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

mi verdadero proyecto

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 CIConfiguré 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/



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.