2010-05-18 15 views
48

Tengo un archivo con la configuración de la base de datos en mi proyecto que he configurado con algunos valores predeterminados. El archivo es rastreado por Mercurial y se registra. Dado que este archivo se editará con diferentes valores en varias máquinas desarrolladoras, ¿hay alguna manera de decirle a Mercurial que ignore los cambios en este archivo?Mercurial: cómo ignorar los cambios en un archivo rastreado

Intenté agregar el archivo al archivo .hgignore, pero dado que se realiza un seguimiento del archivo, no se ignora. Esto está bien y es bueno en otras situaciones, pero me pregunto si hay algo que pueda hacer aquí.

Respuesta

23

El uso de una plantilla de archivo es definitivamente la mejor solución. Por ejemplo, si tiene un archivo database.ini, un archivo al database.ini.template e ignorar database.ini en .hgignore

+0

Esto es lo que terminé haciendo :) – Svish

+0

Me doy cuenta de que esto es muy viejo ahora, pero por las dudas, ¿tendrías entonces un script de instalación que copie todos los archivos de plantilla a su nombre de archivo funcional? – Nick

+0

Eso sería una buena idea. No olvides hacer que tu script pida los valores de configuración, ya que pueden diferir del archivo de la plantilla, que está aquí para mostrar la estructura del archivo. – yanjost

8

No hay verdadero proceso automatizado, pero se puede tratar (como en este SO question) la opción -X en hg commit:

% hg stat 
M myfile 
% hg commit -X 'myfile' 

(otras soluciones podrían implican shelve or hq)

Sin embargo, esto no es la solución "correcta". Yo prefiero recomendar versiones:

  • un archivo plantilla
  • un script capaz de generar el archivo final (que se modifica, pero se puede ignorar por completo)
2

Normalmente se comprobaría en una referencia copia del archivo y rastrearlo, luego haga que los desarrolladores hagan una copia de eso para el desarrollo local; realmente no querría que los desarrolladores editen el archivo controlado por el origen para sus propios entornos.

Si su sistema de configuración lo admite, es incluso más fácil si puede usar un archivo de anulación que simplemente anule los valores en la copia de referencia (por ejemplo, la cadena de conexión de la base de datos). De esta forma, los desarrolladores solo deben mantener un conjunto local de valores de anulación muy mínimo.

27

Si siempre desea ignorar el archivo, se puede añadir la opción -X como valor predeterminado para commit a la configuración .hg/hgrc archivo:

[defaults] 
commit = -X program.conf 
+3

Esta es una idea realmente genial , hasta que intentes cometer una fusión. Al comprometer una fusión, no está permitido especificar archivos o patrones. Así que con eso en su '.hgrc', no parece posible comprometer una fusión sin antes editar' .hgrc'. ¿Alguien tiene una solución para eso? – Yitz

+2

Usted pidió esto hace años @Yitz, pero en caso de que sea útil, una solución rápida y sucia que uso es tener un script de lote rápido que mueve el archivo hpg repo, hace la confirmación y lo mueve de regreso. Obviamente, solo va a funcionar si no hay nada más en su hgrc que necesite estar allí. –

+0

@yitz Me pregunto si la razón por la que no funcionó para usted es porque se supone que el archivo se llama hgrc, no .hgrc? – teaman

3

Si está utilizando TortoiseHG, abre la configuración para el repositorio, vaya a la sección Commit (segundo icono de abajo a la izquierda) & añadir el nombre del archivo (s) a la Auto lista de la Excluir derecha (~ 3ra desde abajo en la lista).

De http://tortoisehg.bitbucket.io/manual/0.9/commit.html

+1

Al hacer esto y ejecutar la interfaz de usuario de confirmación, el archivo excluido se desmarca en la lista de archivos de confirmación (automáticamente) y el DIFF estará en gris oscuro. Bonito. –

+0

No puedo hacer que esto funcione, estoy usando TortoiseHg 3.3.3. Agregué el nombre de archivo, la ruta completa, el nombre de archivo parcial con * - ¿siempre está marcado en la interfaz de usuario de confirmación? – gakera

+0

Si ya está rastreado (previamente cometido), ignorarlo no lo afectará, debe "olvidarlo". –

12

Escribimos una extensión para este llamado exclude. Se agregarán automáticamente las opciones -X en los comandos que las admiten, por lo que hg status y hg commit no verán el archivo modificado. Funciona leyendo un archivo .hgexclude desde la raíz de su repositorio, al igual que el archivo .hgignore. Agregar los archivos que desea excluir allí:

syntax: glob 
db.conf 

La extensión funciona bastante bien, pero hay una situación conocida donde falla: fusiones y la confirmación de que sigue una fusión (esto está documentado en el wiki) .Tendría que mejorarse para que guarde las modificaciones en un archivo temporal y luego restaurarlas después. Póngase en contacto si necesita esta característica.

-2

Puede parecer poco intuitivo, pero:

hg rm -Af [file] 

Las dos banderas juntas afirman que el archivo se ha eliminado, y que los cambios deben ser forzados (en lugar de la eliminación debe ser forzado como la ayuda sugiere) . La ayuda y documentación para los indicadores A (after) yf (force) aparentemente no son 100% precisos.

Funcionó para mí en Mercurial 2.0, con la advertencia de que el comando de archivo no incluye el archivo tampoco. Si otros desarrolladores están clonando el repositorio, no debería ser un problema. Obtendrán la versión original y no deberían eliminarla de su directorio de trabajo.

Desde: https://www.mercurial-scm.org/pipermail/mercurial/2008-June/019671.html

+2

Esto no funciona: el archivo se elimina del control de versión, lo que significa que no forma parte de un nuevo clon. También se eliminará si lo hace 'hg update' : piénselo como un 'hg remove' normal que simplemente deja el archivo atrás en ** su ** copia de trabajo. Otros clones no" verán "las banderas' --after' y '--force' así que para ellos es solo una eliminación normal y el archivo se borra cuando se actualizan. –

1

Si ya está siendo rastreado el archivo, puede emitir el comando se olvide de archivo. Si está utilizando TortoiseHg, haga clic con el botón derecho en el archivo durante la confirmación y seleccione Olvidar. El archivo también debe estar ya en la lista de ignorar.

Tuve el mismo problema que el tuyo, el archivo sigue apareciendo en cada commit, aunque ya está en la lista de ignorar. Probé el comando Olvidar y funcionó.

+0

¡excelente! ¡Ayudó mucho! – icesar

2

Puedes probar hg forget. Para obtener más información, consulte official manual about the same command. Me funcionó.

creo, algo como esto está más cerca de una respuesta correcta a la pregunta original Mercurial: Cómo ignorar los cambios en un archivo de seguimiento, en lugar de los otros que sugieren una plantilla, etc.

+3

Esta respuesta es equivalente a la respuesta de irlandés. El problema es que 'hg forget' elimina el contenido existente del archivo de la repositorio, que el OP no quería. – Brilliand

Cuestiones relacionadas