unchanged unchange assumed git git-branch git-assume-unchanged git-skip-worktree

git assumed unchanged



No es posible cambiar de rama después de--skip-worktree (6)

¿Hay alguna razón para tener una variante vacía de ese archivo registrado? Si no

git rm --cached path/to/file echo ''path/to/file'' >> .gitignore git commit -m''stop tracking path/to/file''

podría resolver su problema. (Tendrá que repetirse para cada rama que tenga el archivo. O si no le importa reescribir el historial, use git filter-branch para deshacerse de él en confirmaciones previas, también).

LO QUE QUIERO HACER

Tengo un archivo que contiene datos confidenciales, por lo que no quiero enviar el contenido de este archivo al servidor remoto.

¿LO QUE HICE?

Para lograr esto, hice una confirmación cuando el archivo estaba vacío y envié este archivo vacío al servidor (GitHub). Y luego rellene el archivo con datos confidenciales y git update-index --skip-worktree path/to/file aplicado. Pero no hice ningún compromiso.

Ahora estoy tratando de cambiar mi rama pero estoy recibiendo este error:

error: Your local changes to the following files would be overwritten by checkout: path/to/file Please, commit your changes or stash them before you can switch branches. Aborting

¿POR QUÉ skip-worktree EN LUGAR DE assume-unchanged ?

Leí unas cuantas preguntas sobre este tema, y ​​encontré la respuesta de Borealid .

--asumir sin cambios supone que un desarrollador no debería cambiar un archivo. Este indicador está destinado a mejorar el rendimiento de las carpetas que no cambian, como los SDK.

--skip-worktree es útil cuando le pides a git que no toque un archivo específico porque los desarrolladores deberían cambiarlo. Por ejemplo, si el repositorio principal principal contiene algunos archivos de configuración listos para producción y no quiere cometer cambios accidentalmente en esos archivos, --skip-worktree es exactamente lo que desea.

Después de esto, encontré la pregunta de Jeff y la respuesta de VonC . El problema de Jeff es casi el mismo que el mío, y seguí la solución de VonC. Sin embargo, no es trabajo para mí. Tal vez debido a la diferencia de versión git. Porque esa pregunta de 2012. Hablamos con VonC y él dijo que hiciera esto como una nueva pregunta porque no podía recordar la respuesta.

Intenté usar --assume-unchanged y --skip-worktree juntos, y soft reseting worktree. Pero nada cambió.

¿ASI QUE?

¿Me pueden ayudar con mi problema?

Gracias.


Bueno, esta es una solución cruda, pero parece funcionar razonablemente bien (aunque solo está ligeramente probada):

Cree un archivo llamado git-checkoutsw en algún lugar de su PATH , con el siguiente contenido:

#!/bin/bash git ls-files -v | grep "^S " | cut -c3- | readarray ignored for x in "${ignored[@]}"; do git update-index --no-skip-worktree -- "$x" done git checkout -m $@ for x in "${ignored[@]}"; do git update-index --skip-worktree -- "$x" done

La secuencia de comandos captura la lista de archivos ignorados, los anula, revisa la nueva rama con -m (para combinación) y cualquier otro parámetro que se haya especificado, y luego los ignora nuevamente.

Ahora puedes hacer git checkoutsw lugar de git checkout .


Hasta ahora, --asume-sin cambios y --skip-worktree no funcionan como lo encontré. Mi versión de git es: git versión 2.8.4 (Apple Git-73) Stash es la única forma en que funciona hasta ahora.


No he podido encontrar una solución clara para esto, así que estoy usando un archivo .bat para ejecutar --no-skip-worktree en los archivos afectados. Luego stash , cambio de rama, stash apply y luego uso otro archivo .bat para ejecutar --skip-worktree en los mismos archivos.

No es agradable, pero es la forma más simple y rápida que he encontrado hasta ahora.


Puede habilitar el pago disperso y agregar el archivo junto con la adición del indicador skip-worktree (si agrega el pago disperso solo, probablemente se eliminará).

Para excluir un archivo, debe colocarlo en un archivo de comprobación dispersa (consulte el manual de git-read-tree ):

/* !unwanted

Entonces no se tocará en la actualización (por lo tanto, no obtendrá el contenido de la otra rama allí, sino que conservará sus ediciones). Puede que no sea lo que quieres.


Tuve el mismo problema y se redujo a cambios de entrada en el archivo que quería asumir, sin cambios.

Por lo tanto, si simplemente no presumo-no se modifica en el archivo, lo escondo, reviso la última versión, saco mi alijo y asumo -cambiado de nuevo.

Así que ahora puedo cambiar de rama otra vez.