Domanda Come posso aggiungere una directory vuota ad un repository Git?


Come posso aggiungere una directory vuota (che non contiene file) ad un repository Git?


3466
2017-09-22 16:41


origine


risposte:


Un altro modo per far rimanere una directory vuota (nel repository) è creare un .gitignore file all'interno di quella directory che contiene queste quattro righe:

# Ignore everything in this directory
*
# Except this file
!.gitignore

Quindi non devi ottenere l'ordine giusto come devi fare in m104's soluzione.

Ciò dà anche il vantaggio che i file in quella directory non verranno visualizzati come "non tracciati" quando si esegue uno stato git.

Fabbricazione @GreenAsJadeIl commento è persistente:

Penso che valga la pena notare che questa soluzione fa esattamente quello che la domanda ha richiesto, ma non è forse quello che molte persone che stanno guardando questa domanda avrebbero cercato. Questa soluzione garantisce che la directory rimanga vuota. Dice "Non voglio veramente che i file vengano registrati qui". Al contrario di "Non ho file da controllare qui, ancora, ma ho bisogno della directory qui, i file potrebbero arrivare più tardi".


3356
2018-05-31 22:10



Non puoi Vedere il FAQ Git.

Attualmente il design dell'indice git   (area di staging) consente solo i file   essere elencati, e nessuno abbastanza competente   per fare la modifica per consentire vuoto   le directory hanno a cuore abbastanza   questa situazione per rimediare.

Le directory vengono aggiunte automaticamente   quando si aggiungono file al loro interno. Quella   è, le directory non devono mai essere aggiunte   al repository e non sono tracciati   da soli.

Si può dire "git add <dir>" ed esso   aggiungerà file in là.

Se hai davvero bisogno di una directory per   esistere in cassa è necessario creare un   file in esso. .gitignore funziona bene per   questo scopo; puoi lasciarlo vuoto,   o inserisci i nomi dei tuoi file   aspettarsi di apparire nella directory.


981
2017-09-22 16:42



Crea un file vuoto chiamato .gitkeep nella directory e aggiungilo.


594
2017-12-07 16:03



È sempre possibile inserire un file README nella directory con una spiegazione del motivo per cui si desidera questa directory, altrimenti vuota, nel repository.


366
2018-03-14 23:38



touch .keep

Su Linux, questo crea un file vuoto chiamato .keep. Questo nome è preferito sopra .gitkeep come il primo è agnostico a Git, mentre il secondo è specifico di Git. In secondo luogo, come un altro utente ha notato, il .git la convenzione del prefisso deve essere riservata ai file e alle directory utilizzati da Git stesso.

In alternativa, come indicato in un altro risposta, la directory può contenere un descrittivo README o README.md file anziché.

Ovviamente ciò richiede che la presenza del file non causi la rottura della tua applicazione.


259
2018-01-29 04:29



Perché avremmo bisogno di cartelle con versioni vuote

Cominciando dall'inizio:

Una directory vuota non può far parte di un albero con il sistema di controllo delle versioni di Git.

Semplicemente non verrà tracciato. Ma ci sono degli scenari in cui il "versioning" di una directory vuota può essere utile, ad esempio:

  • costruendo un struttura di cartelle predefinita per le cartelle di progetto utili e rendere questa struttura disponibile per ogni utente / contributore del repository; o, come caso specializzato di cui sopra, creando una cartella per file temporanei, come un cache/ o logs/ directory
  • alcuni progetti semplicemente non funzionerà senza alcune cartelle (che è spesso un suggerimento di un progetto mal progettato, ma è uno scenario frequente nel mondo reale e forse potrebbero esserci, ad esempio, problemi di autorizzazione).

Alcuni suggeriscono soluzioni alternative

Molti utenti suggeriscono:

  1. Posizionamento a README file o un altro file con qualche contenuto per rendere la directory non vuota, o
  2. Creare a .gitignore file con una sorta di "logica inversa" (vale a dire per includere tutti i file) che, alla fine, serve lo stesso scopo di approccio # 1.

Mentre entrambe le soluzioni funzionano sicuramente Li trovo incoerenti con un approccio significativo alla versione di Git.

  • Perché dovresti mettere file fasulli o README che forse non vuoi veramente nel tuo progetto?
  • Perché usare .gitignore fare una cosa (conservazione file) che è l'esatto contrario di ciò a cui è destinato (esclusa file), anche se è possibile?

approccio .gitkeep

Usa un vuoto file chiamato .gitkeep per forzare la presenza della cartella nel sistema di controllo delle versioni.

Anche se potrebbe non sembrare una grande differenza:

  • Si utilizza un file che ha il singolo scopo di mantenere la cartella. Non ci metti informazioni che non vuoi mettere.

    Ad esempio, dovresti usare i README come, beh, i README con informazioni utili, non come scusa per mantenere la cartella.

    La separazione delle preoccupazioni è sempre una buona cosa, e puoi ancora aggiungere un .gitignore ignorare i file indesiderati.

  • Nominandolo .gitkeep lo rende molto chiaro e diretto dal nome del file stesso (e anche ad altri sviluppatori, che è buono per un progetto condiviso e uno degli scopi principali di un repository Git) che questo file è

    • Un file non correlato al codice (a causa del punto iniziale e del nome)
    • Un file chiaramente correlato a Git
    • Il suo scopo (conservare) è chiaramente affermato, coerente e semanticamente opposto nel suo significato a ignorare

Adozione

Ho visto il .gitkeep approccio adottato da framework molto importanti come laravel, Angular-CLI.


202
2017-12-04 23:32



Come descritto in altre risposte, Git non è in grado di rappresentare directory vuote nella sua area di staging. (Vedi il FAQ Git.) Tuttavia, se, ai fini dell'utente, una directory è vuota abbastanza se contiene a .gitignore solo file, quindi puoi creare .gitignore file nelle directory vuote solo tramite:

find . -type d -empty -exec touch {}/.gitignore \;

119
2018-05-03 15:17



Andy Lester ha ragione, ma se la tua directory ha solo bisogno di essere vuota, e non vuoto vuoto, puoi mettere un vuoto .gitignore file in là come soluzione alternativa.

Per inciso, questo è un problema di implementazione, non un problema fondamentale di progettazione dello storage Git. Come è stato detto più volte nella mailing list di Git, la ragione per cui questo non è stato implementato è che nessuno si è preoccupato abbastanza di presentare una patch per questo, non che non poteva o non doveva essere fatto.


57
2017-09-22 17:28



Il Ruby on Rails modo:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Ora la directory del registro sarà inclusa nell'albero. È molto utile quando si esegue la distribuzione, quindi non sarà necessario scrivere una routine per creare directory di registro.

I file di log possono essere tenuti fuori emettendo,

echo log/dev.log >> .gitignore

ma probabilmente lo sapevi.


29
2017-10-22 13:24



Git non traccia le directory vuote. Vedere il FAQ Git per ulteriori spiegazioni. La soluzione suggerita è di inserire un .gitignore file nella directory vuota. Non mi piace questa soluzione, perché il .gitignore è "nascosto" dalla convenzione Unix. Inoltre non vi è alcuna spiegazione del perché le directory siano vuote.

Suggerisco di inserire un file README nella directory vuota per spiegare perché la directory è vuota e perché deve essere tracciata in Git. Con il file README in atto, per quanto riguarda Git, la directory non è più vuota.

La vera domanda è perché hai bisogno della directory vuota in git? Di solito hai una sorta di script di build che può creare la directory vuota prima di compilarla / eseguirla. Se no, allora creane uno. Questa è una soluzione molto migliore rispetto a mettere directory vuote in git.

Quindi hai qualche ragione per cui hai bisogno di una directory vuota in git. Metti questo motivo nel file README. In questo modo altri sviluppatori (e in futuro tu) sanno perché la directory vuota deve essere lì. Saprete anche che è possibile rimuovere la directory vuota quando il problema che richiede la directory vuota è stato risolto.


Per elencare ogni directory vuota utilizzare il seguente comando:

find -name .git -prune -o -type d -empty -print

Per creare README segnaposto in ogni directory vuota:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Per ignorare tutto nella directory tranne il file README, inserisci le seguenti righe nel tuo .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

In alternativa, potresti solo escludere ogni File README da ignorare:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Per elencare tutti i README dopo che sono già stati creati:

find -name README.emptydir

25
2018-05-06 15:45



ATTENZIONE: questo tweak non funziona veramente come risulta. Ci dispiace per l'inconvenienza.

Post originale qui sotto:

Ho trovato una soluzione mentre giocavo con Git internals!

  1. Supponiamo che tu sia nel tuo repository.
  2. Crea la tua directory vuota:

    $ mkdir path/to/empty-folder
    
  3. Aggiungilo all'indice usando un comando idraulico e l'albero vuoto SHA-1:

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder
    

    Digitare il comando e quindi inserire la seconda riga. stampa accedere e poi Ctrl + D per terminare il tuo contributo. Nota: il formato è modalità [SPAZIO] genere [SPAZIO] SHA-1hash [TAB] percorso (la scheda è importante, la formattazione della risposta non la conserva).

  4. Questo è tutto! La tua cartella vuota è nel tuo indice. Tutto quello che devi fare è impegnarti.

Questa soluzione è breve e apparentemente funziona bene (guarda l'EDIT!), ma non è così facile da ricordare ...

L'albero vuoto SHA-1 può essere trovato creando un nuovo repository Git vuoto, cd in esso e il problema git write-tree, che emette l'albero vuoto SHA-1.

MODIFICARE:

Sto usando questa soluzione da quando l'ho trovata. Sembra funzionare esattamente allo stesso modo della creazione di un sottomodulo, tranne per il fatto che nessun modulo è definito da nessuna parte. Ciò porta a errori durante l'emissione git submodule init|update. Il problema è che git update-index riscrive il 040000 tree parte in 160000 commit.

Inoltre, qualsiasi file posto sotto quel percorso non verrà mai notato da Git, in quanto pensa di appartenere ad un altro repository. Questo è brutto in quanto può essere facilmente trascurato!

Tuttavia, se non lo fai (e non lo farai), utilizza alcun sottomodulo Git nel tuo repository, e la cartella "vuota" rimarrà vuota o se vuoi che Git sappia della sua esistenza e ignori il suo contenuto, puoi andare con questo tweak. Andare nel solito modo con i sottomoduli richiede più passaggi che questa modifica.


22
2018-01-20 15:50