Cosa sono .git / info / grafts per?

Sto cercando di capire quali sono gli “innesti” nel Git.

Ad esempio, in uno dei più recenti commenti, Tobu suppone di utilizzare git-filter-branch e .git / info / grafts per unire due repository.

Ma non capisco perché ho bisogno di questi innesti ? Sembra che tutto funzioni senza gli ultimi due comandi.

Da Git Wiki :

Punti di innesto o innesti consentono di unire due linee di sviluppo altrimenti diverse. Funziona consentendo agli utenti di registrare le informazioni di origine falsa per i commit. In questo modo puoi far sì che Git finga che il gruppo di genitori di un commit sia diverso da quello che è stato registrato al momento della creazione del commit.

Motivi per l’utilizzo di Grafts

Gli innesti possono essere utili quando si sposta lo sviluppo su git, poiché consente di effettuare la clonazione della vecchia cronologia importata da un altro SCM opzionale. Ciò mantiene il clone iniziale per gli utenti che vogliono solo seguire la versione più recente mentre gli sviluppatori possono avere a disposizione la cronologia completa dello sviluppo.

Quando Linus ha iniziato a usare git per mantenere il suo albero del kernel non esistevano strumenti per convertire la vecchia cronologia del kernel. Successivamente, quando la vecchia cronologia del kernel è stata importata in git dal gateway bkcvs, gli innesti sono stati creati come metodo per rendere ansible bind insieme i due diversi repository.

Quando si lavora con git-svn:

gli innesti git sono molto utili per importare un albero Git in un repository Subversion.

Ad esempio, ho creato un repository Git locale come inizio. Dopo aver lavorato su di esso per diversi giorni, creando molti commit, ho dovuto pubblicarlo nel repository centrale di Subversion e non volevo perdere la cronologia.

Ho trovato il seguente articolo How-to: http://eikke.com/importing-a-git-tree-into-a-subversion-repository/

L’approccio degli innesti menzionato da Chris Johnsen per l’unione di due repository non è più pienamente valido (solo con gli innesti).
Con Git 2.18 (Q2 2018), la funzionalità di ” $GIT_DIR/info/grafts ” è stata sostituita dal meccanismo ” refs/replace/ ” (da qualche tempo a questa parte).
Il codice interno l’ha supportato in molti punti, che è stato ripulito per eliminare il supporto del meccanismo degli “innesti” .

Vedi commit a3694d9 , commit f42fa47 , commit 8d0d81a , commit e2d65c1 , commit f9f99b3 , commit 0115e03 , commit fb40429 , commit 041c98e , commit e24e871 (28 Apr 2018), commit d398f2e , commit fef461e , commit c5aa6db (25 Apr 2018) di Johannes Schindelin ( dscho ) .
(Fuso da Junio ​​C Hamano – gitster – in commit 352cf6c , 23 maggio 2018)

Quindi invece di

 echo "$commit-id $graft-id" >> .git/info/grafts 

Adesso fai:

 git replace --graft $commit-id $graft-id git filter-branch $graft-id..HEAD 

Supporto .git/info/grafts per .git/info/grafts

La funzione di innesti era un modo conveniente per ” linux.git ” la storia antica al nuovo inizio di linux.git .

La sua implementazione, tuttavia, non è all’altezza degli standard di Git, poiché ci sono troppi modi in cui può portare a comportamenti sorprendenti e sgraditi.

Ad esempio, quando si spinge da un repository con innesti attivi, è ansible perdere i commit che sono stati “innestati”, provocando uno stato rotto sull’altro lato.

Inoltre, la funzione di innesti è limitata alla “riscrittura” di elenchi di genitori “impegnati”, non può sostituire nient’altro.

La funzionalità molto più recente implementata come git replace di porre rimedio a tali limitazioni e bug pericolosi.

Visto che git replace è piuttosto maturo ormai (dal momento che 4228e8b (sostituisci: aggiungi --graft option, 2014-07-19, Git 2.1.0) può eseguire i compiti del file dell’innesto), è tempo di deprecare il supporto per l’innesto file, e per ritirarlo alla fine.

Ora (di nuovo, Git 2.18, Q2 2018), hai:

replace : aggiungi --graft opzione --graft

La stringa di utilizzo per questa opzione è:

 git replace [-f] --graft  [...] 

Per prima cosa creiamo un nuovo commit uguale a tranne che i suoi genitori sono [...]

Quindi creiamo un rimpiazzo che si sostituisce con il commit appena creato.

Con questa nuova opzione, dovrebbe essere semplice convertire gli innesti per sostituire i ref.