¿Cómo forzar a Git a abortar un checkout si el directory de trabajo no está limpio (es decir, sin tener en count el control de conflictos)?

Cuando haces un git checkout some_branch , y tu directory de trabajo no está limpio, entonces Git comprobará si el pago dará como resultado algún conflicto, y si lo hace abortará con:

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

Sin embargo, si el pago no da lugar a ningún conflicto, entonces Git cambiará a esa nueva sucursal y transferirá todos los cambios no confirmados (y los enumerará, educado como lo es Git).

 $ git checkout some_branch M some_file M some_other_file Switched to branch 'some_branch' 

Hasta aquí todo bien …

Ahora, no todos los usuarios de Git usan la línea de cmd. Si usa un IDE (como, por ejemplo, Eclipse) y realiza un checkout de some_branch con un directory de trabajo sucio que no generará ningún conflicto, no se le notificará que los cambios en los que estaba trabajando en previous_branch todavía están presentes en su directory de trabajo después de cambiar a some_branch .

Es decir, cuando comstack su código, los cambios no confirmados de previous_branch todavía están presentes en su directory de trabajo en some_branch .

Pregunta 1:

¿Es posible forzar a Git a abortar un checkout si el directory de trabajo no está limpio (no importa si hay algún conflicto o no)?

Preferiría una configuration en la configuration global de Git.

Pregunta 2:

Si esto no es posible de configurar, ¿es entonces una request válida para una nueva opción de configuration en Git?

Como yo veo, Git es muy fuerte en el cambio de context (es decir, trabajando en múltiples problemas en múltiples twigs), y pude ver un uso para una configuration que establece una verificación estricta para si el directory de trabajo no está limpio (sin tener en count el control de conflictos) .

Esto significa que sus cambios creados mientras estaba en la twig n. ° 1 no se transferirán al cambiar a la twig n. ° 2, es decir, usted trabajará estrictamente en el context siempre.

¿Alguna opinión u opinión sobre esto?

No estoy al tanto de tal opción, pero aquí hay un script para simular este comportamiento. Quizás IDE (o OS) se pueda configurar para ejecutar este script en lugar de git-checkout .

 #!/bin/sh MODIFIED=$(git status -s | grep ^\ M) if [ "$MODIFIED" != "" ]; then echo "Current branch is dirty!" exit 1 else git checkout $1 fi 

Puede nombrar este script git-cleancheckout , ponerlo en su $ PATH y ejecutar de esta manera

 git cleancheckout mybranch 

Debería haber una opción para "restablecer" los cambios anteriores. Está representado por --force en la línea de command. Yo uso gitEx y esto está disponible al momento de checkout <branch> siguiente manera:

enter image description here

Esto eliminaría automáticamente todos los cambios locales antes de verificar la sucursal. La opción (ocultación) en la image se puede usar si desea mantener sus cambios en la tienda y recuperarlos una vez que desee comenzar a trabajar nuevamente en la twig anterior.

Debería poder utilizar un enlace posterior a la salida para hacer casi lo que necesita. La limitación es que no hay un gancho de pre-checkout, por lo que no puede abortar. En cambio, solo puede descartar cambios locales para get un estado limpio. Si lo desea, puede save los cambios locales con git stash save X y crear un file de los files sin seguimiento antes de que se eliminen.

Indicas que preferirías una configuration en la configuration global de git; como se sugirió anteriormente en otro lugar en SO , con git 1.7.1 o posterior, puede usar lo siguiente:

 git config --global init.templatedir '~/.git-template' 

para crear todos los repositorys (a través de git init o git clone ) con ganchos con templates. Los ganchos con templates son enlaces simbólicos que apuntan al repository en sí, por lo que no tendrán ningún efecto cuando crees otros repositorys (no relacionados):

 mkdir -p ~/.git-template/hooks && \ ln -sf ../../special-git-hooks/post-checkout ~/.git-template/hooks/. 

El script special-git-hooks/post-checkout es el que implementará el equivalente moral de git checkout --force :

 #!/bin/sh # # git hook to clean branch checkout (git checkout --force plus more) # # arguments to post-checkout (see `man githooks`) OLD_REV=$1 NEW_REV=$2 BRANCH=$3 if [ 0 = "$BRANCH" -ox"$OLD_REV" = x"$NEW_REV"]; then exit 0 fi # Start from the repository root. cd ./$(git rev-parse --show-cdup) ARCHIVE=`mktemp -qu gitco-XXXXXXXXX` git clean -nxd | sed 's/Would remove //' | cpio -oz --format ustar > $ARCHIVE.tgz git add -f $ARCHIVE.tgz git clean -fxd git stash save $ARCHIVE 

Tenga en count que este script no maneja los files con líneas nuevas u otros caracteres que no sean de printing en sus nombres. Estoy trabajando en una versión de Perl de este script que sí lo hace.

En la command-line, simplemente revisa la twig anterior si te das count de que has olvidado algo. En EGit, los cambios son visibles en la vista de etapas, que desafortunadamente no siempre es visible.

Una nueva opción en Git no encuentra automáticamente su path hacia Eclipse, pero mostrar una list de files modificados después de la finalización de la compra parece una request de function de reasable para EGit.