Domanda

Ogni volta che mi impegno, mi preoccupo che mi hanno perso una dipendenza e sto cercando il modo più semplice per testare il mio albero git in isolamento per garantire tutto ciò che è in git indice ("messa in scena") hanno fatto compilare/eseguire in proprio.

Il mio codice dipendenze esiste nel filesystem da dove ho fatto il 'git add' e in modo semplice la compilazione e l'esecuzione di test non garantisce che qualunque cosa io checkin sarebbe compilare/eseguire se l'albero (o area di sosta) è stato checkout su un pulito filesystem.

Potrei avere un continuo costruire che dovrebbe verificare dopo la presentazione, ma io preferisco non avere alcun male si impegna nella storia che, in seguito, ho una patch.Voglio quindi un modo per creare un ambiente isolato che comprende una cassa dell'albero, così come l'indice/area di gestione temporanea.

Una cosa che ho considerato è usare git stash due volte, cioè:

  1. Invocare 'git stash" per salvare il file nell'indice
  2. In qualche modo ottenere un elenco dei file che non vengono rilevate, 'git add' tutti questi file, salvare un nuovo stash
  3. Eliminare tutti i file non tracciati in precedenza
  4. Ripristinare l'originale stash
  5. Io ora dovrebbe avere un ambiente pulito, che ha solo il codice già effettuato il check-in e il codice nell'area di gestione temporanea che posso compilare e testare.
  6. Una volta finito, mi ripristinare la scorta del file non tracciati e quindi si annulla la registrazione di loro di lasciare me nella stessa posizione che avevo in origine.

(Questi file non tracciati possono essere utili, ma non necessariamente le cose che voglio fare il check-in deposito (ad es.i progetti di eclipse).

Ho la sensazione che sto overengineering un semplice problema, però.

È stato utile?

Soluzione

Installare questo script (o qualcosa di simile-il mio è stato rubato troppo) come pre-commit gancio.Si copia l'indice di un lavoro temporaneo dir e corre a costruire lì.Cattura i file che hai perso.

So che ci sono almeno uno o due altri in MODO da domande che affrontare questo problema-prove e/o validare l'indice invece che la directory di lavoro in un pre-commit gancio -- ma io non riesco a trovare di loro per il momento.

(Per completezza, ho questo script nel mio repository .git-ganci/pre-commit/test-la-indice;ci sono un paio di altri script c'.Vedere di seguito per quello che sto usando come .git/ganci/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

Questo è il mio attuale .git/ganci/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

Altri suggerimenti

git stash -u --keep-index prima della prova, seguito da git stash pop dopo il test.

L'installazione di ignorare per i file importanti e semplicemente a cancellare quelle che non sono importanti git clean -df

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top