Ottenere una singola revisione da Git


14

Avere la cronologia completa delle revisioni di Git ha molti vantaggi come parte del processo di sviluppo.

Ma il nostro prodotto è il codice sorgente, stiamo usando linguaggi con script che non necessitano di compilazione o elaborazione, e quindi la cronologia di Git diventa un onere per la distribuzione - nel nostro esempio implementiamo un ambiente virtuale pulito dopo ogni modifica, avendo diverse distribuzioni su una sola macchina.

Esistono alcuni modi per ridurre la quantità di cronologia, ad esempio cloni poco profondi la cui efficienza dipende dalla profondità della revisione nel ramo, eseguendo un recupero anziché un clone, ma si ottiene comunque la cronologia dalla revisione e viceversa, oppure si ottiene il pieno repository una volta, quindi tirare quando necessario, ma ciò è dispendioso in termini di spazio su disco e tende ad essere meno affidabile.

C'è un modo per ottenere una singola revisione da Git senza la sua storia?


1
Domande e risposte correlate su SO stackoverflow.com/questions/26135216/…
Evgeny

Risposte:


16

Clone superficiale

Puoi davvero ottenere un clone superficiale da Git usando:

git clone --depth=1 <url>

Ciò clonerà comunque il repository e creerà una .gitcartella con gli oggetti, di dimensioni solo più piccole (differenza che dipende dalla dimensione del file totale rispetto alla dimensione della cronologia).

Archivio Git

Puoi anche usare git-archive per estrarre un archivio del repository:

Crea un archivio del formato specificato contenente la struttura ad albero per l'albero denominato e lo scrive nell'output standard. Se specificato, viene anteposto ai nomi dei file nell'archivio.

Negli esempi mostra ad esempio:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Crea un tarball compresso per la versione .

Hosted Git, API di archivio

Se stai ospitando il tuo repository su GitHub, puoi utilizzare la loro API di archiviazione :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org ha la stessa funzionalità per questo:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip


7emhem, forse il comando gzip deve essere gzip -c ....
Romeo Ninov

11

Non distribuire il tuo repository git. Sviluppa una vera metodologia di implementazione. Anche se è semplice come archiviare un archivio (= costruire un artefatto con solo i file necessari per essere distribuito) di script distribuiti.

Anche se clonate superficialmente la punta del repository di origine, probabilmente non avrete bisogno di unit test, documentazione, profili di sfilacciatura e altri elementi di supporto nel vostro ambiente distribuito.

Nota : per i repository di linguaggi di script che non hanno realmente un passaggio "build", un modo banale per rilasciare un artefatto sarebbe quello di impacchettarli in un archivio, come tar o rpm. Quindi, per "distribuire", decomprimere l'archivio o installare l'rpm. questo elimina la necessità di strumenti git nella catena di distribuzione (non tutti i server prod avranno quegli strumenti di sviluppo).


va bene porre una domanda (o anche sfidare!) una risposta - questo è ciò che rende grande Stack Stack :) per i repository di linguaggi di script che non hanno davvero un passaggio "build", un modo banale per rilasciare un artefatto sarebbe quello di impacchettare li in un archivio, come tar o rpm. quindi, per "distribuire", decomprimere l'archivio o installare l'rpm. questo elimina la necessità di strumenti git nella tua catena di distribuzione (non tutti i server prod avranno quegli strumenti di sviluppo)
RubyTuesdayDONO

1
@ Pierre.Vriens sì, ti stai perdendo ciò che viene suggerito come tarrare un archivio, ovvero costruire un artefatto con solo i file necessari per essere distribuito. Detto questo, sono d'accordo che non sia una risposta di qualità e questo punto dovrebbe essere esteso. Siamo in beta privata e le risposte non dovrebbero essere esplicite
Tensibai

Quindi non vedo cosa questo porti più della risposta accettata, se è puntato verso l'archivio di adattamento ... è solo ridondante, dovresti modificare per estendere in questo modo iMHo
Tensibai

1
Per favore controlla la mia modifica della tua risposta (ho appena integrato il tuo commento interessante). Sentiti libero di migliorare / rielaborare ovviamente, o semplicemente di tornare indietro se non ti piace affatto la mia modifica. A proposito: il tuo commento (= nota che ho aggiunto) mi ha fatto pensare "davvero, così semplice? Ancora un esempio di come otteniamo le cose fatte in zOS ... con z per zero tempi di inattività ...". Penso che sia tempo di iniziare a mettere in discussione altre domande / risposte tramite commenti simili ... Non
sfidarmi

non pretendo che questa sia una risposta completa o modello, ma non ho visto nessun altro rivolgersi all'elefante nella stanza: se usi git per "distribuire" il tuo progetto, "passerai un brutto momento" ;)
RubyTaysdayDONO

6

Domanda c'è un modo per ottenere una singola revisione da Git senza la sua storia?

Per ottenere un repository, no, non c'è modo, principalmente perché non c'è "revisione". Git store esegue il commit, che sono modifiche rispetto allo stato precedente.
Se vuoi il tuo repository in un determinato momento, devi eseguire il commit in questo momento e tutti i suoi antenati o otterrai solo le modifiche apportate nel commit.

Per evitare confusione: la clonazione superficiale sta ottenendo la storia necessaria e poi troncandola nello spazio libero, l'albero è ancora fatto dalla storia.

Per le soluzioni, la risposta di @ 7ochem le copre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.