...
This document examples are based on Douglas HublerSIPfoundry's repository on git-hub: http://github.com/dhublerSIPfoundry/sipxecs
Working with GIT repository in local mode
...
Sources have to be downloaded in read-only mode on a chosen path on local computer, so there is no danger to overwrite the original code:
Code Block |
---|
git clone git://github.com/dhublerSIPfoundry/sipxecs.git |
Example:
Code Block |
---|
[user@localhost~]$ mkdir work [user@localhost~]$ cd work [user@localhost]$ git clone git://github.com/dhublerSIPfoundry/sipxecs.git Initialized empty Git repository in /home/mirceac/work/sipxecs/.git/remote: Counting objects: 127119, done.remote: Compressing objects: 100% (29946/29946), done.remote: Total 127119 (delta 84094), reused 126491 (delta 83609)Receiving objects: 100% (127119/127119), 751.56 MiB | 1.69 MiB/s, done. Resolving deltas: 100% (84094/84094), done.Checking out files: 100% (11021/11021), done. [user@localhost]$ ls sipxecs |
Now, verify to what branch you are positioned using the following command:
Code Block |
---|
git status
|
Use the following command to list all visible branches
Code Block |
---|
git branch
|
The origin repository has many branches and you have to relay your work on one of them: master Sometimes this branch is hidden and you have to make it visible
Use the following command to list all branches
Code Block |
---|
git branch -a
|
Note: The branch: master is not the present locus of development – that 'branch' reflects the state of a tree that stayed in step with the former Avaya SVN tree. Almost certainly you wish to use: master which is the real "master" as of November 2010How to make branch master visible and be positioned on it
Code Block |
---|
git checkout -b master origin/master
|
Watch the following code-snipped to accomplish this
Example:
Code Block |
---|
[user@localhostsipxecs]$ git branch * master [user@localhostsipxecs]$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/master remotes/origin/release-4.2 [user@localhostsipxecs]$ git checkout -b master origin/master Branch master set up to track remote branch master from origin. Switched to a new branch 'master' [user@localhostsipxecs]$ git status # On branch master nothing to commit (working directory clean) [user@localhostsipxecs]$ git branch master * master [user@localhostsipxecs]$ |
...
Run the commands from below:
Code Block |
---|
git fetch origin //make sure that you are in sync with the remote repository (origin)
git checkout master //move to master branch, because we want to base our work on this
git rebase origin/master //rebase your master branch with the origin master branch just to keep in sync with the latest source code
git checkout -b TEST //create an position to a new branch called TEST, the branch were your changes will be performed
|
TIP: if there is a branch you don't like you can always delete it using:
Code Block |
---|
git branch -D TEST
|
...after all your changes are done and you are prepared for the final step: generate patch, run the following commands
Code Block |
---|
git status //to verify what files are new and what are changed
git add <file_path> //if there are newly created files on your branch
git commit -a //commit your work
use git commit -a --amend if you want that your changes to be on top on a previous commit - in this way all will be included in a single patch
|
...
git commt -a --amend will preserve previous commit comments and changes
Code Block |
---|
TEST: Test Title
Description
# Please enter the commit message for your changes. Lines starting# with '#' will be ignored, and an empty message aborts the commit.
# Committer: Mircea Carasel
# On branch TEST
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
# modified: sipXconfig/neoconf/etc/freeswitch/freeswitch.xml
#~
|
As a rule, after the title a blank line should be inserted and then the patch description
Example:
Code Block |
---|
[user@localhostsipxecs]$ git checkout master
Switched to branch 'master'
[user@localhostsipxecs]$ git status
# On branch masternothing to commit
(working directory clean)
[user@localhostsipxecs]$ git rebase origin/master
Current branch master is up to date.
[user@localhostsipxecs]$ git status
# On branch master
nothing to commit (working directory clean)
[user@localhostsipxecs]$ git checkout -b TEST
Switched to a new branch 'TEST'
[user@localhostsipxecs]$ git status
# On branch TEST
nothing to commit (working directory clean)
[user@localhostsipxecs]$
****after all your changes are done****
[user@localhostsipxecs]$ git status
# On branch TEST
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: sipXconfig/neoconf/etc/freeswitch/freeswitch.xml
#
no changes added to commit (use "git add" and/or "git commit -a")
[user@localhostsipxecs]$ git commit -a
[TEST 747365d] UC-TEST: Patch title
1 files changed, 1 insertions(+), 1 deletions(-)
[user@localhostsipxecs]$ git status
# On branch TEST
nothing to commit (working directory clean)
|
...
Run the commands from below:
Code Block |
---|
git fetch origin //make sure that you are in sync with the remote repository (origin)
git checkout master //move to master branch, because we want to base our work on this
git rebase origin/master //rebase your master branch with the origin master branch just to keep in sync with the latest source code
git checkout TEST //move to your branch
git rebase master //keep in sync your branch with your master branch that now is in sync with origin's master
|
If rebase cannot be performed automatically, git may require you to manually perform some changes.
Example:
Code Block |
---|
Falling back to patching base and 3-way merge...
Auto-merging sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/bulk/csv/Index.java
CONFLICT (content): Merge conflict in sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/bulk/csv/Index.java
Auto-merging sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/common/AbstractUser.java
Auto-merging sipXconfig/neoconf/test/org/sipfoundry/sipxconfig/bulk/ldap/UserMapperTest.java
CONFLICT (add/add): Merge conflict in sipXconfig/neoconf/test/org/sipfoundry/sipxconfig/bulk/ldap/UserMapperTest.java
Auto-merging sipXconfig/web/src/org/sipfoundry/sipxconfig/site/admin/ldap/LdapServer.java
Failed to merge in the changes.Patch failed at 0001 XX-6279: Import contact information from LDAP
When you have resolved this problem run "git rebase --continue".If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
[user@localhostsipxecs]$ git add sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/bulk/csv/Index.java
[user@localhostsipxecs]$ git add sipXconfig/neoconf/test/org/sipfoundry/sipxconfig/bulk/ldap/UserMapperTest.java
[user@localhostsipxecs]$ git rebase --continue
|
Code Block |
---|
git format-patch master -o <output directory>
|
Code Block |
---|
[user@localhostsipxecs]$ git format-patch master -o /home/mirceac/patches/
/home/mirceac/patches/0001-UC-TEST-Patch-title.patch
[user@localhostsipxecs]$
|
Code Block |
---|
git checkout sipXconfig/neoconf/etc/freeswitch/freeswitch.xml
|
...
- Create an account on git-hub and add open-source repository (free)
- From git-hub project page, fork Douglas's project into your own repository
- Create ssh keys on both sides: local and on your git account(to prepare your local clone): http://www.question-defense.com/2009/02/04/add-a-ssh-key-to-your-github-account-for-a-linux-server
- Clone your project in read/write mode
NOTE: Use: ssh-add ~/.ssh/id_rsa if you cannot get sources in read-write mode after adding ssh key
Commands:
Code Block |
---|
git clone git@github.com:mirceac/sipxecs.git
//At this point you have tracked only your repository (origin)
git remote (or git remote -v)
return: origin
|
Track upstream remote repository (Douglas's):
Code Block |
---|
git remote add upstream git://github.com/dhublerSIPfoundry/sipxecs.git (note the read-only url, there is no chance to write on upstream) git remote return: origin upstream |
In order to keep in sync the upstream repository and origin repository (yours)
Code Block |
---|
git checkout master //move to master branch
git fetch upstream //get latest code from upstream
git rebase upstream/master //rebase your local master branch repository with upstream
git status //to verify if your local branch has something that needs to be pushed to origin
git push origin +: //push on origin
NOTE: In order to automatically update a specific branch (master),
instead of git fetch upstream it is recommended to use:
git pull upstream master
This command will automatically align your master branch with the upstream master performing automatic rebase
|
...
- Perform any commit/rebase operation as explained above
- Merge changes on your local master repository
- Push your master repo on origin
Commands:
Code Block |
---|
git checkout master //move to master branch
git rebase TEST //push TEST changes on top of your master branch
git push origin +: //push your local master branch on origin
|
Send your changes upstream: From your project's project’s page, click the "pull request" “pull request” button
The upstream owner may accept or may reject your commit
...