2013-04-26 7 views
103

.gitignore può ignorare interi file, ma esiste un modo per ignorare linee di codice specifiche durante la codifica?Come dire a git di ignorare le singole righe, cioè gitignore per linee specifiche di codice

Aggiungo spesso e ripetutamente le stesse linee di debug in un progetto, solo per ricordarmi di rimuoverle prima di eseguire il commit. Mi piacerebbe solo mantenere le linee nel codice e fare in modo che il git non li trascuri.

+37

non posso dire se questa è una pessima idea o di un brillante uno . –

+0

@KyleStrand per lo meno, posso aggiungerlo alle linee di debug che digito e mi sento sicuro sapendo che non verranno commessi accidentalmente – Kache

+4

Giusto, questa è la parte "brillante". –

risposta

91

Questo è come tipo di voi può fare con git filters:

  1. Create/Open File gitattributes:.
    • < progetto root>/gitattributes (saranno impegnati in pronti contro termine)
      O
    • < root del progetto> /. Git/info/attributi (non verrà eseguito il commit nel repository)
  2. Aggiungere una linea che definisce i file da filtrare:
    • *.rb filter=gitignore, cioè il filtro eseguire chiamato gitignore su tutti *.rb file
  3. definire il filtro gitignore nel gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", vale a dire eliminare queste linee
    • $ git config --global filter.gitignore.smudge cat, ovvero non fare nulla quando si estrae il file dal repository

Note:
Naturalmente, questo è per i file rubino, applicato quando una riga termina con #gitignore, applicato a livello globale in ~/.gitconfig. Modifica questo tuttavia è necessario per i vostri scopi.

Avviso !!
Questo lascia il tuo file di lavoro diverso dal repository (ovviamente). Qualsiasi verifica o ribasso significherà che queste linee andranno perse! Questo trucco può sembrare inutile dal momento che queste righe vengono ripetutamente perse al check out, rebase o pull, ma ho un caso d'uso specifico per utilizzarlo.

Proprio git stash save "proj1-debug"mentre il filtro è inattivo (basta disabilitare temporaneamente in gitconfig o qualcosa del genere). In questo modo, il mio codice di debug può sempre essere git stash apply 'd al mio codice in qualsiasi momento senza timore che queste righe vengano mai commesse accidentalmente.

Ho una possibile idea per gestire questi problemi, ma cercherò di implementarlo in un altro momento.

Grazie a Rudi e jw013 per aver menzionato i filtri git e i gitattributes.

+2

Wow. È fantastico. – rjmunro

+2

Non dovrebbe essere: 'git config --global filter.gitignore.clean sed '/ # gitignore $/d'' dato che hai chiamato il filtro 'gitignore' –

+0

Ah, infatti. In realtà, c'è anche una citazione che sfugge al problema. – Kache

12

Ho avuto un problema simile scrivendo codice java. La mia soluzione era quella di markup codice che non volevo commettere e quindi aggiungere un pre-commit hook che cercare la mia marcatura:

#!/bin/bash 
# 
# This hook will look for code comments marked '//no-commit' 
# - case-insensitive 
# - dash is optional 
# - there may be a space after the // 
# 
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit") 
if [ "$noCommitCount" -ne "0" ]; then 
    echo "WARNING: You are attempting to commit changes which include a 'no-commit'." 
    echo "Please check the following files:" 
    git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/ - /' 
    echo 
    echo "You can ignore this warning by running the commit command with '--no-verify'" 
    exit 1 
fi 
+0

Markup ritiene decisamente meno spaventosa la soluzione e dichiarativa, rispetto al filtro basato su 'sed' o simili. Ben fatto. – akshay