2009-10-23 12 views
32

Tengo el problema opuesto al "How do I make Git ignore file mode (chmod) changes?" Tengo un archivo en el que he cambiado el permiso ejecutable, pero también hay algunos cambios de texto, y deseo confirmar el anterior pero no el último . ¿Es esto posible con git?¿Cómo hago que git acepte cambios de modo sin aceptar todos los cambios de texto?

(En realidad, he hecho algunos cambios en el texto que quiere comprometerse junto con el cambio de permiso de ejecución, y otros que no quiero cometer)

Actualizar: Unstaging los cambios al texto archivo, y luego haciendo git add -p de nuevo e incorporando algunos de los cambios de texto logrados para obtener el cambio de modo en la puesta en escena. (Mi versión de git es 1.5.4.3)

Respuesta

15

git add -i le permitirá agregar selectivamente algunos trozos de un archivo al índice. No sé si es sensible a los permisos, pero si añadiera un trozo después de la operación chmod, podría terminar en el índice correctamente incluso sin actualizar explícitamente el permiso.

+4

Eso es correcto, git add -i (y git add --patch) que piden "cambio de modo de escenario?" justo antes de que pregunten por los trozos cambiados. – Phil

+0

Gracias Phil. Esa habilidad parece estar asociada con git 1.5.6 de acuerdo con las notas de la versión. (Desafortunadamente, mi git no es tan reciente) –

74

Usted debe ser capaz de hacer:

git update-index --chmod=(+|-)x <file> 

para ajustar el bit ejecutable almacenado en el índice.

A continuación, puede confirmar esto por separado de cualquier cambio en el contenido de los archivos.

+0

** Nota: ** use "git commit" (con "git add" si es necesario, no "git commit -a". Esta solución tiene la ventaja de que funciona incluso con Git antiguo –

+1

Y también funciona en sistemas de archivos con soporte deficiente de permisos! Incluso Windows! – remram

+0

Esta solución es mucho mejor, @Andrew Grimm. Acepte esta respuesta, por favor. – lmaooooo

3

Charles’ answer estaba agregando el modo de archivo y los cambios de contenido en el índice para mí. Trabajé alrededor de esto así.

git update-index --skip-worktree --chmod=+x <file> 
git update-index --no-skip-worktree <file> 

Example

Alternativamente se puede hacer

git update-index --chmod=+x <file> 
git config interactive.singlekey 1 
echo na | git reset -p 
Cuestiones relacionadas