2013-07-05 26 views
7

Sono nuovo di git quindi per favore portami con me.Come si inserisce un file fittizio in un repository git?

Dire che ho un file sotto controllo di versione che include dati sensibili. Abbastanza sicuro, ho messo quel file nel mio file .gitignore, quindi non viene spinto al repository. Il problema ora è da qualche parte nel mio progetto che ho una riga come

#include <sensitivedata> 

o qualunque sia la lingua di scelta. Il problema è quando qualcuno clona da quel repository, quel file è mancante e ottiene un errore fatale quando prova a compilare/compilare la soluzione.

Così, invece di spingere il file In realtà sto lavorando in poi voglio spingere alcuni file fittizio con lo stesso nome, invece, in cui metto un commento come

// replace the next line with the sensitive data!!! 

Come faccio a fare questo?

risposta

7

Si potrebbe utilizzare .gitatrributes per filtrare i contenuti:

  • .gitattributes

    secrets.h filter=secret merge=keepMine 
    
  • .git/config

    [filter "secret"] 
    clean = echo "// replace the next line with the sensitive data" 
    smudge = cat 
    
    [merge "keepMine"] 
        name = always keep mine during merge 
        driver = /bin/true %O %A %B 
    

ho gettato un ' keepMine 'unione per evitare fusioni accidentali. Tuttavia, l'unione AFAIK non dovrebbe nemmeno dare il calcio d'inizio, in quanto le modifiche locali sarebbero effettivamente 'invisibili' a causa del passaggio del filtro clean. Indipendentemente da ciò che è in realtà secrets.h, il file repo conterrà sempre:

// replace the next line with the sensitive data 

Es .:

/tmp/work$echo '// agent 007 reporting for duty' > secrets.h
/tmp/work$git status -s
M secrets.h
/tmp/work$git diff
/tmp/work$git cat-file -p HEAD:secrets.h
// secret contents not in repo

+0

fantastico! Grazie! – lightxx

+2

A capo: i file '.git/config' sono locali. È necessario assicurarsi che tutti gli utenti di questo repository abbiano le definizioni del filtro, dal momento che '.gitattributes' è nel repository. Puoi leggere la [pagina man di git-attributes] (https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html) per maggiori dettagli – sehe

0

non so se il C++ preprocessore è in grado di farlo (Suppongo che il codice mostrato sopra è per qualche preprocessore c-stile), ma qui è quello che faccio in casi simili:

commit in git:

  • default.config
  • user.config.modello

messo in gitignore:

  • user.config

e poi devo codice che fa in sostanza:

if (file_exists(user.config)): 
    use user.config 
else: 
    use default.config 

in questo modo posso fornire qualche difetto sensibile e avere un modo semplice e pulito per ignorarlo.

+1

Grazie per il tuo contributo. Stavo pensando qualcosa sulla stessa linea di te, ma poi ho deciso di non farlo perché voglio completamente separare qualsiasi problema di controllo del codice sorgente dal codice reale. Solo per completezza se qualcun altro vuole seguire questa strada, è possibile farlo usando qualcosa di simile nel makefile: http://stackoverflow.com/a/142926/899260 – lightxx