Marcar el archivo como "no transmisible" con Git

41

Quiero mostrar algunos de mis trabajos cargándolos en mi cuenta de GitHub. Sin embargo, hay algunos archivos que contienen contraseñas, como conexiones de bases de datos.

¿Hay alguna manera de marcar un archivo como no compatible con Git para que no pueda aparecer en GitHub?

Adam Carter
fuente
1
Sugerencia tangencial: Esto podría no ser aplicable en todas las plataformas, ya que algunas están muy casadas con los archivos de configuración, pero podría considerar seguir el enfoque de 12 factores para mantener estos parámetros en el entorno: 12factor.net/config . Es decir, que el código de la aplicación nunca asuma la presencia de un archivo de configuración. (A diferencia de un script de inicio privado que establece estos, pero nunca abandona su máquina local.)
millimoose
1
Si los confirma accidentalmente, asegúrese de eliminarlos del historial completo de git (otras preguntas explicarán cómo) porque incluso si lo elimina e ignora, la versión confirmada anterior permanecerá en el historial y estará visible en Github.
curiousdannii
3
Tenga en cuenta que todas las respuestas realmente no responden a su pregunta. No hacen que el archivo sea incompatible, simplemente configuran git para que lo ignore por defecto. Pero si inserta accidentalmente ese nombre de archivo en una línea de comando de git, puede terminar confirmándolo aunque coincida con un patrón .gitignore. AFAIK no hay una forma 100% completa de decir gitque evite cometer un archivo específico en todos los casos. Aunque esto puede verse como una característica ... que permite que los comandos explícitos anulen las configuraciones genéricas.
Bakuriu
Puede eliminar las contraseñas codificadas y cambiar a una alternativa más segura. Después de eso, puede cambiar las contraseñas de la base de datos. Las contraseñas antiguas todavía están dentro de las confirmaciones, pero están desactualizadas una vez que alguien que usted puede leerlas. Estoy bastante seguro de que no puede cambiar una confirmación una vez que ya está construida.
BlueWizard
3
Además de lo que dijo @curiousdannii, GitHub tiene una página completa que discute cómo eliminar datos confidenciales que accidentalmente cometió. Entre otras cosas, esta página dice que cambie cualquier contraseña y clave que haya publicado accidentalmente. help.github.com/articles/remove-sensitive-data
Kevin - Restablece a Monica el

Respuestas:

67

¿Hay alguna manera de marcar un archivo como no compatible con Git para que no pueda aparecer en GitHub?

Primero, no hay forma de tener algunos archivos y confirmaciones visibles en su repositorio local de Git pero de alguna manera no visibles en GitHub; Si tiene un archivo confirmado en Git, aparecerá en GitHub.

En segundo lugar, no existe una forma simple y práctica de marcar un archivo individual como "no transmisible". Pero definitivamente hay una forma de ignorar un archivo en un repositorio de Git: agregando los archivos, incluida su ruta relativa si necesario — a un .gitignorearchivo :

Un .gitignorearchivo especifica archivos intencionalmente no rastreados que Git debería ignorar. Los archivos ya seguidos por Git no se ven afectados; vea las NOTAS a continuación para más detalles.

Crear un básico .gitignorees bastante fácil ya que es solo un archivo de texto sin formato. Entonces, por ejemplo, si tuviera un config.phparchivo en su raíz, haría esto; suponiendo que está utilizando PHP, pero el concepto se aplica a cualquier configuración. También estoy usando Nano como mi editor de texto en este ejemplo, pero siéntase libre de usar el editor de texto que normalmente usa para esto:

nano .gitignore

Y simplemente agregue ese nombre de archivo a ese archivo:

config.php

Guárdelo y ahora Git simplemente ignorará ese archivo.

Dicho esto, lo que me gusta hacer para configuraciones como esta es mantener una configuración de muestra / ejemplo neutralizada de detalles confidenciales en el repositorio, por lo que tengo alguna referencia sobre qué formato de archivo de configuración es un archivo llamado algo así:

config.SAMPLE.php

De esa manera, usted sabe exactamente cómo se config.phpdebe configurar el archivo config.SAMPLE.phpy puede asegurarse de que config.phpGit nunca toque el archivo real .

Además, si planea mostrar su código, debe esperar que alguien intente tomar ese código e implementarlo en su propio sistema de alguna manera. Recuerde, no somos usted y sin un archivo de configuración de muestra en su repositorio, la gente realmente no entenderá cómo implementar el código por su cuenta. Diablos, incluso podrían pensar que no eres competente porque no proporcionaste un ejemplo de configuración básica.

JakeGould
fuente
11
+1 para la respuesta correcta y sugiriendo un archivo de configuración de muestra. Hay algunas bibliotecas como Figaro para Ruby que te empujan en esta dirección. Debe tener un archivo de muestra comprometido con valores similares a los valores reales para que la persona que mira su código sepa cómo debería ser el entorno. Algunas plataformas, como Heroku, usan variables de entorno, por lo que puede configurar su configuración en algo como database_url = Environment.DATABASE_URLy dejar un comentario arriba como # postgres://username:password@localhost/dbname.
Chris Cirefice
@ChrisCirefice Gracias! Siempre me sorprende que aparezcan nuevas "herramientas" que deberían recordar lo obvio: si este código va a ser leído por otros humanos, ¿no explica exactamente cómo funciona una configuración? Gracias de nuevo.
JakeGould
27

También puede agregar un enlace previo a la confirmación para implementar comprobaciones de cordura. El directorio .git/hooksde cada repositorio git tiene algunos scripts de muestra.

El script llamado pre-commitse ejecuta si existe antes de cada confirmación y un valor de retorno distinto de cero anula la confirmación.

Por ejemplo, podría tener un script simple como este:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

Y si eso filenamecoincide, la confirmación falla.

Juho Östman
fuente
1
+1 esta es la respuesta correcta que en realidad evita agregar y confirmar explícitamente el archivo.
R ..
De hecho, aunque la práctica recomendada es no confiar en tener esta prevención en su lugar (es decir, use `.gitignore en su lugar).
David Z
2
@R .. Sí y no. Si bien la pregunta dice: "marcar un archivo como no compatible", el espíritu es "evitar que un archivo se comprometa". La realidad que se está creando .gitignorees una práctica muy común, y comúnmente entendida, para cualquiera que use Git. Pero la mayoría de los usuarios de Git no utilizan realmente un script previo a la confirmación. Requiere cierto conocimiento de la configuración y requiere alguna razón verdadera por la cual un método como este sería preferible a simplemente usar un .gitignorearchivo. Pero esto es muy útil para algunos casos más complejos, pero definitivamente es un concepto que usaría cuando realmente sepa que necesita usarlo.
JakeGould
2
Pude ver el uso de esto en situaciones en las que no puede confiar al 100% .gitignore (puede hacer algo tonto accidentalmente exigir que git agregue el archivo para comit). O tal vez alguien más podría editar el archivo .gitignore (después de todo, está bajo control de versión). Si realmente necesita un proceso comprobable, esto es algo en lo que podría trabajar en dicho proceso.
Cort Ammon
@CortAmmon no siempre se trata de confianza. Puede agregar información de depuración temporal y no pública a su código fuente que no desea confirmar, pero no puede ignorar dicho archivo. En cambio, desea verificarlo antes de confirmar si no contiene nada ilegal . Esto parece una buena solución para este caso de uso. Y de hecho, así es como encontré esta pregunta porque es mi caso de uso.
t3chb0t
12

Lo que dijo @JakeGould. En algunos casos, también puede utilizar bits de archivo especiales como skip-worktreeo assume-unchangedque se pueden configurar de la siguiente manera; para las diferencias entre los dos, vea esta respuesta de desbordamiento de pila :

git update-index --assume-unchanged <file>

Lo que luego ocultará cambios adicionales a un archivo ya existente y que podría usar si realmente desea que un archivo esté allí después de cada extracción. Pero le aconsejaría que solo lo use si realmente sabe lo que está haciendo.

phk
fuente
8

Usa un me .gitignoregusta @JakeGould dijo. Además, alguna información relacionada:

  • .gitignoreevita que los archivos sean rastreados; si ya están rastreados, use git rm --cachedpara eliminarlos
  • los archivos / patrones $GIT_DIR/info/excludetambién serán ignorados
  • los archivos / patrones en el archivo especificado por core.excludesFile en el usuario ~/.gitconfigtambién se ignoran.

Consulte la documentación oficial de Git para más detalles.

46and2
fuente
2

Para ampliar las respuestas de Jake y 46: una muy buena práctica es tener una extensión consistente que use para los archivos en los que incluya información privada, y use .gitignoresiempre para excluir archivos con esa extensión globalmente (usando el .gitconfigarchivo como se menciona en otro lugar para que siempre se ignore) para tu usuario).

De esa manera, puede tener por ejemplo:

/projectname/mypasswords.exc 

y si ha excluido *.excglobalmente, sabe que no se confirmará, incluso si olvida excluir individualmente ese archivo específico.

Joe
fuente