2011-01-06 9 views
10

Sto scrivendo un semplice hook git pre-commit che aggiorna l'anno nelle intestazioni del copyright per i file che sono messi in scena per il commit.Come posso usare git per mettere in scena solo una riga in un file per il commit, tutto da uno script?

Dopo aver modificato la riga con il copyright, vorrei che l'hook eseguisse quella riga in modo che faccia parte del commit. Non può solo git add l'intero file, perché potrebbero esserci altre modifiche preesistenti che non dovrebbero essere messe in scena.

Non vedo alcuna opzione nel manuale git add che consente di mettere in riga linee specifiche.

I figura potrei git stash save --keep-index, applicare la mia modifica, git add il file e quindi git stash pop, ma che sembra piuttosto grezzo. Qualche approccio migliore?

risposta

2

Ecco un'altra soluzione possibile:

  1. Prima di eseguire lo script di copyright-modifica, fare un git status per ottenere un elenco dei file che sta per commettere. Salva l'elenco dei file. Fai un commit.

  2. Quindi, riporre il resto delle modifiche (non correlate) e applicare lo script all'elenco di file salvati in precedenza. Utilizzare git commit --amend per modificare il commit precedente.

  3. Infine, inserire la scorta per ripristinare l'indice. Risolvi i conflitti se necessario.

non so di un modo per dire git add aggiungere linee solo specifici. Come descriveresti le linee da aggiungere? Per numero di linea? Sembra che potrebbe essere possibile in un ristretto insieme di circostanze e generalmente non utile.

+0

Ah, approccio pulito, anche se personalmente preferirei aspettare il commit. – Sandy

1

È possibile correggere la versione a fasi del file in un passaggio separato, ad es.

blobid=$(git show :"$filepath" | copyright-filter | git hash-object -w --stdin) 

if $? -eq 0; then 

    git update-index --cacheinfo 100644 "$blobid" "$filepath" && 
    copyright-filter "$filepath" 

fi 

ho spudoratamente presume che lo script si chiama copyright-filter e lavora come un filtro o in luogo, a seconda delle sue argomentazioni.

1

Guardando la sorgente a git add --interactive sembra che il modo in cui modifica l'indice sia con git apply --cached. Assumendo che il copyright è il primo pezzo di qualsiasi diff, apportare la modifica e l'uso:

git diff -- file | 
awk 'second && /^@@/ {exit} /^@@/ {second=1} {print}' | 
git apply --cached 

Dove che seconda linea (lo script awk afferra solo il primo pezzo diff). È anche possibile costruire l'output diff a mano o utilizzare altre regole per selezionare il hunk.

Problemi correlati