Come ottenere un certo commit dal progetto GitHub


151

Devo scaricare l'API di Facebook da GitHub . Normalmente, faccio clic sulla scheda "Download" per scaricare l'ultimo codice sorgente. In questo caso, ho bisogno di un commit precedente: 91f256424531030a454548693c3a6ca49ca3f35a , ma non ho idea di come ottenere l'intero progetto da quel commit ...

Qualcuno può dirmi come fare?

(A proposito, sono su un mac. Non so se questo fa alcuna differenza).


1
vedere anche stackoverflow.com/questions/13636559/… se "solo" è necessario il "codice zipped-snapshot".
Jean Fontaine,

Risposte:


216

Innanzitutto, clonare il repository usando git, ad esempio con:

git clone git://github.com/facebook/facebook-ios-sdk.git

Ciò scarica la cronologia completa del repository, quindi puoi passare a qualsiasi versione. Quindi, passare al repository appena clonato:

cd facebook-ios-sdk

... e usa git checkout <COMMIT>per passare al commit corretto:

git checkout 91f25642453

Questo ti darà un avvertimento, dal momento che non sei più su un ramo e sei passato direttamente a una versione particolare. (Questo è noto come stato "HEAD distaccato".) Dal momento che sembra che tu voglia usare solo questo SDK, piuttosto che svilupparlo attivamente, questo non è qualcosa di cui devi preoccuparti, a meno che tu non sia interessato a scoprirlo più su come funziona git.


4
A questo punto puoi anche git exportse vuoi solo i file.
Xeoncross,

1
git checkout -q <commit#>silenzia avvertimento stderr durante il checkout git.
Manavalan Gajapathy,

Quando eseguo il checkout 441b034635240bc873700473af3e98533e94a0b5, viene visualizzato un errore: irreversibile: il riferimento non è un albero: 441b034635240bc873700473af3e98533e94a0b5
ttb

135

Non so se fosse presente quando avevi pubblicato questa domanda, ma il modo migliore e più semplice per scaricare un commit è fare clic sulla scheda commit quando si visualizza un repository. Quindi invece di fare clic sul nome del commit, fare clic su Sfoglia il repository a questo punto nel pulsante Cronologia con il simbolo <> sul lato destro del nome / messaggio del commit e infine sul pulsante Scarica ZIP che viene visualizzato quando si fa clic su Clona o Pulsante di download .

Spero che vi aiuti ragazzi.


3
Questo è l'unico modo per recuperare "commit persi" che sono commit di cui Github ha una storia, ma che sono stati cancellati dalla cronologia "ufficiale" di Git. Usando questo, è possibile ottenere un'istantanea zip di un commit che è stato ridimensionato nell'oblio, spingere quel commit in un nuovo ramo, recuperare quel ramo in un repository esistente e riproporlo in esistenza.
Ajax,

@Ajax Non è vero. Puoi ancora ottenere lo sha usando git reflog, e quindi verificare il commit distaccato
Aaron Brager

@AaronBrager certo, reflog funzionerà, SE sei sulla stessa macchina che aveva inizialmente avuto il commit. L'OP conosce già il commit, quindi non avrebbero bisogno di un reflog e potrebbero semplicemente effettuare il checkout direttamente. Tuttavia, sto parlando di casi in cui non si ha il commit a livello locale e non si trova su alcun ramo che sia ancora nel repository pubblico. In questi casi, github potrebbe avere ancora una registrazione del commit, che puoi scaricare come zip per poter recuperare il commit.
Ajax

@Ajax Ah, grazie per il chiarimento. In alternativa, puoi toccare l'API GitHub ( api.github.com/repos/facebook/facebook-ios-sdk/events ) e creare un ramo dal commit orfano ( istruzioni qui )
Aaron Brager

Molto bella. +1 Non sapevo che si potesse interrogare il reflog di Github in quel modo!
Ajax

27

La risposta di Sivan in gif inserisci qui la descrizione dell'immagine

1.Fare clic su commit in github

2. Selezionare Sfoglia codice sul lato destro di ciascun commit

3.Fare clic su download zip, che scaricherà il codice sorgente in quel momento del commit


Ciao Suraj, per favore, puoi dirmi come hai creato la gif del tuo schermo?
Rahul Satal,

usa il lettore Quick Time per registrare un video sullo schermo. Converti i video in GIF usando qualsiasi strumento disponibile. Google. @ Rahul Satal
Suraj K Thomas

1
Grazie @SurajKThomas per la gif
Sivan,

10

Per scaricare un commit utilizzando il modulo breve SHA1 a 7 cifre, procedi come segue:

Esempio di lavoro:

https://github.com/python/cpython/archive/31af650.zip  

Descrizione:

 `https://github.com/username/projectname/archive/commitshakey.zip`

Se hai la chiave hash lunga 31af650ee25f65794b75d4dfefed6fe4758781c1, ottieni solo i primi 7 caratteri 31af650. È l'impostazione predefinita per GitHub.


8

Il modo più semplice che ho trovato per recuperare un commit perso (che esiste solo su Github e non localmente) è creare un nuovo ramo che includa questo commit.

  1. Tieni aperto il commit (url come: github.com/org/repo/commit/long-commit-sha)
  2. Fai clic su "Sfoglia file" in alto a destra
  3. Fai clic sul menu a discesa "Albero: short-sha ..." in alto a sinistra
  4. Digita un nuovo nome di filiale
  5. git pull il nuovo ramo in giù a locale

Questa risposta è più generale di quella accettata. Ho incontrato questa situazione in cui il commit che volevo era già scomparso sul ramo master e Github non manterrà tutti i commit su rami inesistenti. Quindi questo approccio creerà un nuovo ramo da quel commit su Github e lo renderà estraibile.
Qi Luo,

Questo mi ha permesso di recuperare un commit (con SHA originale intatto) da un fork eliminato da cui ho fatto un PR. Dopo aver creato un nuovo fork, ho aperto il commit PR sul repository upstream quindi ho "sfogliato i file". Ho quindi copiato tale URL e sostituito il nome utente con il mio. Quindi ho fatto clic sull'albero: menu a discesa e ho creato un nuovo ramo nel mio fork. Ha funzionato alla grande!
Allen Luce

2

Il titolo della domanda è ambiguo.


1

In aggiunta alla risposta accettata:

Per visualizzare gli hash è necessario utilizzare il comando suggerito "git checkout hash ", è possibile utilizzare git log. Tuttavia, a seconda delle necessità, esiste un modo più semplice di copiare / incollare gli hash.

È possibile utilizzare git log --onelineper leggere molti messaggi di commit in un formato più compresso.

Diciamo che vedi questo un elenco di una riga dei commit con informazioni minime e hash solo parzialmente visibili:

hash111 (HEAD -> master, origin/master, origin/HEAD)
hash222 last commit
hash333 I want this one
hash444 did something
....

Se vuoi last commit, puoi usare git checkout master^. Il ^ti dà il commit prima che il padrone. Così hash222.

Se si desidera l'ultimo ennesimo commit, è possibile utilizzare git checkout master~n. Ad esempio, l'utilizzo git checkout master~2ti darebbe il commit hash333.


0

Invece di navigare tra i commit, puoi anche premere il ytasto ( Guida di Github , Tasti di scelta rapida ) per ottenere il "permalink" per la revisione / commit corrente.
Questo cambierà l'URL da https://github.com/<user>/<repository>(master / HEAD) a https://github.com/<user>/<repository>/tree/<commit id>.

Per scaricare il commit specifico, dovrai ricaricare la pagina da quell'URL, quindi il Clone or Downloadpulsante punterà allo "snapshot" https://github.com/<user>/<repository>/archive/<commit id>.zip anziché all'ultimo https://github.com/<user>/<repository>/archive/master.zip.


0

Prova la seguente sequenza di comandi:

$ git fetch origin <copy/past commit sha1 here>
$ git checkout FETCH_HEAD
$ git push origin master

-1

Se si desidera eseguire un determinato commit o si desidera codificare un determinato commit, è possibile utilizzare il comando seguente:

git checkout <BRANCH_NAME>
git reset --hard  <commit ID which code you want>
git push --force

Esempio:

 git reset --hard fbee9dd 
 git push --force

2
Questo è pericoloso, ha più senso clonare il repository e verificare una versione
user1767754
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.