rastreados - gitignore regex
¿Cómo puedo hacer que Git ignore futuras revisiones de un archivo? (7)
Creé una versión predeterminada de un archivo incluido en un repositorio de git. Es importante que cuando alguien clone el repositorio, obtenga una copia de este archivo. Sin embargo, me gustaría configurar git para que ignore los cambios en este archivo más tarde. .gitignore
funciona solo en archivos sin .gitignore
.
Mi motivación es que este archivo contiene información específica de la máquina. Me gustaría proporcionar valores predeterminados, al tiempo que permite a las personas realizar cambios locales que no serán reubicados en el repositorio de origen, creando conflictos de combinación cuando realizamos nuevos cambios.
En general, somos bastante flojos y usamos git add .
mucho, así que estoy bastante seguro de que si no puedo decirle a git que ignore este archivo, los cambios terminan comprometiéndose y presionándose.
Para resumir,
- Me gustaría crear un archivo, llamarlo
default_values.txt
que se agrega a mi repositorio de git y se incluye cuando alguien clona ese repositorio. -
git add .
no debería agregardefault_values.txt
a la confirmación. - Este comportamiento debe transmitirse a cualquier clon del repositorio.
Como muchos otros lo han mencionado, una buena solución moderna es:
git update-index --skip-worktree default_values.txt
Eso ignorará los cambios en ese archivo, tanto local como ascendente, hasta que decida permitirlos de nuevo con:
git update-index --no-skip-worktree default_values.txt
Puede obtener una lista de archivos marcados omitidos con:
git ls-files -v . | grep ^S
Tenga en cuenta que a diferencia de --skip-worktree, el estado --assume-unchanged "se perderá una vez que se tira de un cambio en sentido ascendente.
Eche un vistazo a las secuencias de comandos / borrado de secuencias de comandos. De esta forma puede controlar la versión del archivo, pero cuando está desprotegido lo "manchará" al reemplazar los datos genéricos / de marcador de posición con los datos específicos de la máquina en el archivo.
Cuando lo compromete, lo "limpiará" reemplazando la información específica de la máquina con información genérica o de marcador de posición.
Los scripts de borrado / limpieza deben ser deterministas en el sentido de que aplicarlos varias veces, en diferentes órdenes será el equivalente a ejecutar el último en la secuencia.
Lo mismo se puede aplicar con contraseñas si necesita exponer su repositorio, pero los contenidos pueden contener información confidencial.
El enfoque que generalmente he visto es crear un archivo con un nombre diferente, por ejemplo: default_values_template.txt y poner default_values.txt en su .gitignore. Indique a las personas que copien default_values_template.txt a default_values.txt en sus espacios de trabajo locales y realicen los cambios necesarios.
Encontré una solución que funciona para mi equipo. Compartimos nuestros githooks a través de enlaces simbólicos y, después de agregar un archivo de plantilla a git, agregué un enlace precompromiso que verifica si el archivo de la plantilla se ha modificado y, de ser así, git reset -- templatefile.txt
. Si es el único archivo modificado también cancelo la confirmación.
Lo he resuelto definiendo el filtro "limpio" para simplemente capturar el contenido del archivo en el índice.
git show :path/to/myfile
solo debe imprimir el contenido del índice para el archivo especificado, para que podamos usarlo en una secuencia de comandos para reemplazar la copia de trabajo con la copia intacta en el índice:
#! /bin/sh
git show :$1
Establezca eso como el filtro "limpio" para el archivo en cuestión (suponiendo que lo haya puesto en "discard_changes"):
$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes
Lamentablemente, no puedo encontrar una forma de hacer que esto se pueda generalizar a varios archivos, ya que no hay forma de saber qué archivo estamos procesando desde el script limpio. Por supuesto, no hay nada que le impida agregar una regla de filtro diferente para cada archivo, pero es un poco complicado.
Lo que está buscando es git update-index --assume-unchanged default_values.txt
.
Consulte los documentos para obtener más detalles: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
Sugiero buscar en los submódulos. Si coloca los archivos específicos de la máquina en un submódulo, git add debe ignorarlo.