Just as an alternative to the SO question “How do you merge selective files with git-merge?”, I just found this GitHub thread which could be more adapted for merging a whole subdirectory, based on git read-tree:
My repository =>
cookbooks
My repository target directory =>cookbooks/cassandraRemote repository =>
infochimps
Remote repository source I want merged intocookbooks/cassandra=>infochimps/cookbooks/cassandraHere are the commands I used to merge them
Add the repository and fetch it
git remote add -f infochimps git://github.com/infochimps cluster_chef.gitPerform the merge
git merge --allow-unrelated-histories -s ours --no-commit infochimps/master(this performs a merge by using the ‘ours’ strategy (
-s ours), which discards changes from the source branch.
This records the fact thatinfochimps/masterhas been merged, without actually modifying any file in the target branch)
Merge only
infochimps/cookbooks/cassandraintocassandragit read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandraThis reads the tree for only the required source subdirectory i.e.
cookbooks/cassandra, on the upstream branch of the source repository.Note that the target subdirectory name should also be
cookbooks/cassandra, or you would see:fatal: Not a valid object name
Commit the change
git commit -m 'merging in infochimps cassandra'
Addendum
It’s bizarre,[edit me] — but the read-tree step can possibly fail like this:
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
… even when both files are identical. This might help:
git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
But off course, verify manually that this does what you want.