Proprio come alternativa alla domanda SO " Come si uniscono file selettivi con git-merge? ", Ho appena trovato questo thread GitHub che potrebbe essere più adattato per unire un'intera sottodirectory, basato su git read-tree :
- My repository =>
cookbooks
My repository target directory =>cookbooks/cassandra
- Repository remoto =>
infochimps
Fonte del repository remoto in cui desidero unire cookbooks/cassandra
=>infochimps/cookbooks/cassandra
Ecco i comandi che ho usato per unirli
- Aggiungi il repository e recuperalo
git remote add -f infochimps git: //github.com/infochimps/cluster_chef.git
git merge --allow-unrelated-histories -s ours --no-commit infochimps / master
(questo esegue un'unione utilizzando la strategia "ours" ( -s ours
), che elimina le modifiche dal ramo di origine. Questo registra il fatto che infochimps/master
è stato unito, senza effettivamente modificare alcun file nel ramo di destinazione)
- Unisci solo
infochimps/cookbooks/cassandra
incassandra
git read-tree --prefix = cassandra / -u infochimps / master: cookbooks / cassandra
Questo legge l'albero solo per la sottodirectory sorgente richiesta cookbooks/cassandra
, cioè sul ramo a monte del repository sorgente .
Nota che anche il nome della sottodirectory di destinazione dovrebbe essere cookbooks/cassandra
, altrimenti vedrai:
fatal: Not a valid object name
- Commetti il cambiamento
git commit -m 'fusione in infochimps cassandra'
Addendum
È bizzarro, [modificami] , ma il read-tree
passaggio potrebbe fallire in questo modo:
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
... anche quando entrambi i file sono identici . Questo potrebbe aiutare:
git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
Ma ovviamente, verifica manualmente che questo faccia ciò che desideri.