1

I have a project "A" that is a Git repository. I would like to be able to make multiple copies of project A (B and C), and modify them for clients.

"A" is the master so sometimes when I do new functionality i would like to be able to pull them into B or C. But some commits should just stay in A and only be used if making a new clone.

How do I do that with Git? That is:

  • how to copy A? (Clone?)
  • how to get specific commits into B and C?

Please keep in mind that this all happening locally - not on GitHub. I use OS X.

Robert Greiner
  • 29,049
  • 9
  • 65
  • 85
jriff
  • 1,947
  • 3
  • 23
  • 33

1 Answers1

1
  • how to copy A?

git clone is the way, meaning you establish a publication link between A and B,C, allowing for pushing/pulling commits between them.

  • how to get specific commits into B and C?

By having in the repo A:

  • private branches where you develop as many feature you want (but this branch is never pushed anywhere else)
  • public branch which will be pushed to B and C
  • merge or rebase --onto your commits from your private branch on top of your public branch, then push that public branch to B or C.

One workflow would be for instance:

cd ~/projectA
git checkout master
git branch private
# do some commits, some private, some useful to a
git checkout master
git branch feature_for_a
git cherry-pick sha1_from_private

cd ~/project_B
git fetch project_A
git checkout --track feature_for_a # check modifs for a
git checkout master
git merge feature_for_a
# do some client specific modifications
Community
  • 1
  • 1
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
  • Thanks a lot for your reply. Can you write the commands for a typical workflow? Eg. 1. git clone ~/project_a ~/project_b 2. [make changes to project_a] 3. [now what? :)] – jriff Mar 28 '10 at 19:09
  • @jriff: answer updated with *one example* of possible workflow – VonC Mar 28 '10 at 19:30
  • BTW. Some commits should only go to some of the clones. A commit might be a feature or a bugfix that doesn't need to go to all the clones. Also I think it would be better to pull the commits I want rather than push them from project_a. – jriff Mar 28 '10 at 19:37
  • @jriff: the cherry-pick step is meant precisely to pick and choose what commit you want in branches meant for other repo. And since you fetch them (and create a local branch in b for tracking what you have fetch, that is similar to pull them), you are not pushing anything from project_a: you can't, project_b being a non-bare repo, it is not eligible to any direct push from project_a – VonC Mar 28 '10 at 19:40
  • Thanks a lot - could you have a look at the answer I made - it is similar to your workflow - only a little simpler - can you explain the drawbacks of that approach? – jriff Mar 28 '10 at 19:49
  • @jriff: I believe I just did ;) – VonC Mar 28 '10 at 19:50
  • Our comments crossed each other :^) – jriff Mar 28 '10 at 19:51