compensation temporairement les fichiers avant trassez dans Git commit
-
29-09-2019 - |
Question
Chaque fois que je commets, je crains que je l'ai manqué une dépendance et je suis à la recherche de la façon la plus simple de tester mon arbre git dans l'isolement pour assurer tout ce qui est de l'indice git ( « mis en scène ») va dans la compilation de fait / courir eux-mêmes.
Mon dépendances de codes existent dans le système de fichiers d'où je fais le « git add » et la compilation si simple et l'exécution des tests ne garantit pas que tout ce que je checkin compilerions / courir si l'arbre (ou une zone de stockage intermédiaire) a été checkout sur sur un système de fichiers propre.
Je pourrais avoir une accumulation continue qui vérifierait après la soumission, mais je préfère ne pas avoir de mauvaises commits dans l'histoire que j'ai plus tard patch. Je veux donc un moyen de créer un environnement isolé qui comprend une caisse de l'arbre, ainsi que l'index / zone de stockage intermédiaire.
Une chose que j'ai pris en compte est deux fois en utilisant git stash, i.e.:.
- Invoke 'git stash' pour enregistrer les fichiers dans l'index
- obtenir une certaine façon une liste des fichiers non suivis, « git add » tous ces fichiers, enregistrez une nouvelle planque
- Supprimez tous les fichiers précédemment trassez
- Restaurer la planque d'origine
- Je dois maintenant avoir un environnement propre qui a seul le code déjà vérifié dans le code et dans la zone de mise en scène que je peux compiler et tester.
- Une fois terminé, je restaurer la planque des fichiers non suivis puis les untrack me laisser dans la même position que j'étais à l'origine.
(Ces fichiers non suivis peuvent être utiles mais pas nécessairement ce que je veux vérifier dans le référentiel - par exemple les projets Eclipse).
Je sens que je suis overengineering un problème simple, cependant.
La solution
Installer ce script (ou quelque chose comme ça - le mien est volé trop) comme un crochet pre-commit. Il copie l'index à un répertoire de travail temporaire et exécute une construction là-bas. Il va attraper les fichiers que vous avez manqué.
Je sais qu'il ya au moins un ou deux autres questions de SO qui traitent de cette question exacte - test / validation de l'index au lieu du répertoire de travail dans un crochet pre-commit - mais je ne peux pas sembler les trouver à droite maintenant.
(Pour être complet, j'ai ce script dans mon repo .git crochets / pre-commit / test l'indice, il y a deux ou trois autres scripts il Voir ci-dessous pour ce que je suis en utilisant comme. .git / hooks / pre-commit).
#!/bin/sh
#
# Via: http://github.com/jwiegley/git-scripts/blob/master/pre-commit.sh
#
if [ ! $(git rev-parse --symbolic-full-name HEAD) = refs/heads/master ]; then
exit 0
fi
# These are the locations I keep my temporary source and build trees in
TMPDIR=$HOME/code/myproject-pre-commit
MIRROR=$HOME/code/myproject-pre-commit-mirror
# Exit with status 1 if any command below fails
set -e
# Checkout a copy of the current index into MIRROR
git checkout-index --prefix=$MIRROR/ -af
# Remove files from MIRROR which are no longer present in the index
git diff-index --cached --name-only --diff-filter=D -z HEAD | \
(cd $MIRROR && xargs -0 rm -f --)
# Copy only _changed files_ from MIRROR to TMPDIR, without copying timestamps.
# This includes copying over new files, and deleting removed ones. This way,
# "make check" will only rebuild what is necessary to validate the commit.
rsync -rlpgoDOc --delete --exclude-from=.git-hooks/excludes $MIRROR/ $TMPDIR/
# Everything else happens in the temporary build tree
cd $TMPDIR
nosetests
exit 0
Ceci est mon .git réelle / crochets / pre-commit:
#!/bin/bash
set -e
for hook in $(find .git-hooks/pre-commit -perm /u+x,g+x,o+x -type f -not -name '*~' 2>/dev/null)
do
echo "@@ Running hook: $(basename $hook)"
$hook "$@"
done
Autres conseils
git stash -u --keep-index
avant le test, suivi par git stash pop
après le test.
Configuration ignorer les fichiers importants et effacer tout simplement ceux qui ne sont pas importants git clean -df