Difference between revisions of "Git"

From Healthcare Robotics Wiki
Jump to: navigation, search
(Add a remote branch to work directly with the google code repository)
(Clone from the internal server)
 
(45 intermediate revisions by 2 users not shown)
Line 1: Line 1:
  
== Local Clone of a Google Code Repository for Internal Use==
+
== Tutorials ==
 +
* http://git-scm.com/documentation
 +
 
 +
== Tips and Tricks ==
 +
* [http://www.arthurkoziel.com/2008/05/02/git-configuration/ Initial setup]
 +
* [http://help.github.com/ignore-files/ ignore files]
 +
* GUIs:
 +
*# gitk:
 +
*#* sudo apt-get install gitk
 +
*#* http://sitaramc.github.com/1-basic-usage/gitk.html#1_basic_usage_gitk_the_missing_gitk_documentation_
 +
*#* run gitk from within the git repository
 +
*# git gui
 +
*#* sudo apt-get install git-gui
 +
 
 +
=== Customize your bash prompt ===
 +
 
 +
==== Show the branch name ====
 +
===== Method 1 =====
 +
* The following steps allow you to have colored text at the command prompt for telling you which current branch you are using:
 +
** Download the script from [https://raw.github.com/git/git/master/contrib/completion/git-completion.bash/ here] and put in home directory
 +
** Add these lines to your .bashrc file:
 +
***source ~/git-completion.bash
 +
***export PS1='\[\e[36;1m\]\u@\[\e[32;1m\]\H:\[\e[0m\]\w\[\e[31;1m\]$(__git_ps1 "(\%s)")\[\e[0m\]>'
 +
****lots of this command is text coloring, see [http://www.pantz.org/software/shell/enhancingshellprompt.html/ this site] for details
 +
**[[File:Git_colored_command_prompt.png|x414px]] - example of what this does
 +
 
 +
===== Method 2 =====
 +
 
 +
Add this to your bashrc:
 +
 
 +
function parse_git_branch {
 +
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
 +
}
 +
COLOR_NONE="\[\e[0m\]"
 +
GREEN="\[\033[0;32m\]"
 +
RED="\[\033[0;31m\]"
 +
export PS1="[\u@\h \W]$RED\$(parse_git_branch)$COLOR_NONE\$ "
 +
 
 +
[[File:Git_prompt_advait.png]]
 +
 
 +
== Git Repositories for Internal Use==
  
 
=== Motivation ===
 
=== Motivation ===
* Advait thinks it might be good for people in lab to be able to push to and pull from a non-google computer that has a clone of gt-ros-pkg
+
* Advait would like to have internal git repositories as well.
* The goal would be to use this as an internal git repository with the option of pushing to gt-ros-pkg hosted on google.com when code is ready to be publicly downloadable.
+
* The goal would be to use these for active development and release by merging to a repo on gt-ros-pkg hosted on google code.
  
=== Steps ===
+
=== Create a new git repository on internal server ===
==== Create bare git repository on internal git server ====
+
# ssh mycroft@skynet
# ssh skynet.hsi.gatech.edu -lmycroft
+
# mkdir internal_git_bare
+
 
# cd internal_git_bare
 
# cd internal_git_bare
# Clone gt-ros-pkg with advait as the user on skynet.hsi.gatech.edu: <br> git clone https://advaitjain@code.google.com/p/gt-ros-pkg.hrl/
+
# mkdir test_repository
 +
# cd test_repository
 +
# git init
 +
# touch .first
 +
#* for some reason git doesn't like completely empty repositories
 +
# git add .first
 +
# git commit -m "initial dummy commit"
 
# Convert to a bare repository using steps from [http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked here]:
 
# Convert to a bare repository using steps from [http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked here]:
## cd gt-ros-pkg.hrl/
+
## cd hrl_haptic_manipulation_in_clutter/
 
## git config --bool core.bare true
 
## git config --bool core.bare true
## mv .git/ ../
+
## rm -rf .first
## rm -rf *
+
## ls -la
## mv ../.git/ .
+
##* you should see a .git
# create an internal_hrl branch: <br>git branch internal_hrl
+
 
# change default branch to internal_hrl:<br>git symbolic-ref HEAD refs/heads/internal_hrl
+
=== Steps on each client machine ===
#* this is the only branch that we should use from the internal server.
+
  
 
==== Clone from the internal server ====
 
==== Clone from the internal server ====
 
# cd to whichever directory you want to keep your repo in. (e.g. cd ~/git)
 
# cd to whichever directory you want to keep your repo in. (e.g. cd ~/git)
# git clone mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/gt-ros-pkg.hrl
+
# git clone mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/hrl_haptic_manipulation_in_clutter
# git checkout --track origin/internal_hrl
+
#* now you will see two branches (master and internal_hrl)
+
#* usually Advait would expect people to work in the internal_hrl branch
+
  
==== Add a remote branch to work directly with the google code repository ====
+
'''Cloning a specific branch'''
# git remote add -f gt-ros-pkg.hrl_google_code https://code.google.com/p/gt-ros-pkg.hrl/
+
# git clone -b advaits_branch mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/hrl_haptic_manipulation_in_clutter
# git checkout -b google_code_master gt-ros-pkg.hrl_google_code/master
+
#* by doing this, I get only advaits_branch and not the master.
  
=== To release code ===
+
'''Pushing a branch to the internal git server'''
 +
# git push origin advaits_new_branch
 +
#* see http://gitready.com/beginner/2009/02/02/push-and-delete-branches.html
 +
'''After pushing a branch:'''
 +
# git branch -r
 +
#* confirm that the branch show up as origin/advaits_new_branch
 +
# git branch -d advaits_new_branch
 +
#* delete the local branch.
 +
# git checkout --track origin/advaits_new_branch
 +
#* Check out and track the new remote branch
 +
 
 +
'''Checkout and track a new remote branch'''
 +
# git checkout --track origin/advaits_new_branch
 +
 
 +
'''Adding a remote branch (from a different repo)'''
 +
# git remote add -f <new_branch_name> <path_to_repo>
 +
 
 +
==== To release code ====
 +
# create an appropriately named release branch.
 +
# push that release branch to the internal server.
 +
# create a new git repository on gt-ros-pkg for the stack to be released.
 +
# clone this gt-ros-pkg repository to your computer.
 +
# add internal repository as a remote branch on your computer's clone of gt-ros-pkg repo: <br> git remote add -f <release_stack_name> mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/<release_stack_name>
 +
# perform a merge: <br> git merge <release_stack_name>/<release_branch>
 +
# optionally reset the history: <br> git reset --soft HEAD^
 +
# git commit -a
 +
#* put in an appropriate release message.
 +
 
 +
 
 +
=== Coverting a stack from svn to a git repository ===
 +
# ssh mycroft@skynet
 +
# cd internal_git_bare
 +
# get a specific folder from svn and make a git repo out of it: <br> git svn clone https://svn.hsi.gatech.edu/cckemp/robot1/src/projects/hrl_haptic_manipulation_in_clutter
 +
# Convert to a bare repository using steps from [http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked here]:
 +
## cd hrl_haptic_manipulation_in_clutter/
 +
## git config --bool core.bare true
 +
## rm -rf *
 +
## ls -la
 +
##* you should see a .git
 +
 
 +
==Old stuff ==
 
# git checkout google_code_master
 
# git checkout google_code_master
 
# git checkout internal_hrl <path to files to release>
 
# git checkout internal_hrl <path to files to release>
Line 44: Line 124:
 
# ssh to skynet and push to google code.
 
# ssh to skynet and push to google code.
  
=== Getting a single folder from svn ===
+
==== To get changes from google code repository ====
* clone just that folder into a separate git repository.
+
Merge the changes in the google_code_master branch with the internal_hrl branch
* then merge this new git repository into gt-ros-pkg.hrl using [http://jasonkarns.com/blog/merge-two-git-repositories-into-one/ these instructions].
+
# git checkout google_code_master
 +
# git pull
 +
# git checkout internal_hrl
 +
# git merge google_code_master
 +
 
 +
==== maybe useful commands? ====
 +
# git checkout --track origin/internal_hrl
 +
#* now you will see two branches (master and internal_hrl)
 +
#* usually Advait would expect people to work in the internal_hrl branch
 +
 
 +
=== Create bare git repository on internal git server ===
 +
# ssh skynet.hsi.gatech.edu -lmycroft
 +
# mkdir internal_git_bare
 +
# cd internal_git_bare
 +
# Clone gt-ros-pkg with advait as the user on skynet.hsi.gatech.edu: <br> git clone https://advaitjain@code.google.com/p/gt-ros-pkg.hrl/
 +
# Convert to a bare repository using steps from [http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked here]:
 +
## cd gt-ros-pkg.hrl/
 +
## git config --bool core.bare true
 +
## rm -rf *
 +
## ls -la
 +
##* you should see a .git
 +
# git branch -m master internal_hrl
 +
#* rename master to internal_hrl
 +
 
 +
==== Add a remote branch to work directly with the google code repository ====
 +
# git remote add -f gt-ros-pkg.hrl_google_code https://code.google.com/p/gt-ros-pkg.hrl/
 +
# git checkout -b google_code_master gt-ros-pkg.hrl_google_code/master

Latest revision as of 19:16, 6 May 2012

Tutorials

Tips and Tricks

Customize your bash prompt

Show the branch name

Method 1
  • The following steps allow you to have colored text at the command prompt for telling you which current branch you are using:
    • Download the script from here and put in home directory
    • Add these lines to your .bashrc file:
      • source ~/git-completion.bash
      • export PS1='\[\e[36;1m\]\u@\[\e[32;1m\]\H:\[\e[0m\]\w\[\e[31;1m\]$(__git_ps1 "(\%s)")\[\e[0m\]>'
        • lots of this command is text coloring, see this site for details
    • Git colored command prompt.png - example of what this does
Method 2

Add this to your bashrc:

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
COLOR_NONE="\[\e[0m\]"
GREEN="\[\033[0;32m\]"
RED="\[\033[0;31m\]"
export PS1="[\u@\h \W]$RED\$(parse_git_branch)$COLOR_NONE\$ "

Git prompt advait.png

Git Repositories for Internal Use

Motivation

  • Advait would like to have internal git repositories as well.
  • The goal would be to use these for active development and release by merging to a repo on gt-ros-pkg hosted on google code.

Create a new git repository on internal server

  1. ssh mycroft@skynet
  2. cd internal_git_bare
  3. mkdir test_repository
  4. cd test_repository
  5. git init
  6. touch .first
    • for some reason git doesn't like completely empty repositories
  7. git add .first
  8. git commit -m "initial dummy commit"
  9. Convert to a bare repository using steps from here:
    1. cd hrl_haptic_manipulation_in_clutter/
    2. git config --bool core.bare true
    3. rm -rf .first
    4. ls -la
      • you should see a .git

Steps on each client machine

Clone from the internal server

  1. cd to whichever directory you want to keep your repo in. (e.g. cd ~/git)
  2. git clone mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/hrl_haptic_manipulation_in_clutter

Cloning a specific branch

  1. git clone -b advaits_branch mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/hrl_haptic_manipulation_in_clutter
    • by doing this, I get only advaits_branch and not the master.

Pushing a branch to the internal git server

  1. git push origin advaits_new_branch

After pushing a branch:

  1. git branch -r
    • confirm that the branch show up as origin/advaits_new_branch
  2. git branch -d advaits_new_branch
    • delete the local branch.
  3. git checkout --track origin/advaits_new_branch
    • Check out and track the new remote branch

Checkout and track a new remote branch

  1. git checkout --track origin/advaits_new_branch

Adding a remote branch (from a different repo)

  1. git remote add -f <new_branch_name> <path_to_repo>

To release code

  1. create an appropriately named release branch.
  2. push that release branch to the internal server.
  3. create a new git repository on gt-ros-pkg for the stack to be released.
  4. clone this gt-ros-pkg repository to your computer.
  5. add internal repository as a remote branch on your computer's clone of gt-ros-pkg repo:
    git remote add -f <release_stack_name> mycroft@skynet.hsi.gatech.edu:/home/mycroft/internal_git_bare/<release_stack_name>
  6. perform a merge:
    git merge <release_stack_name>/<release_branch>
  7. optionally reset the history:
    git reset --soft HEAD^
  8. git commit -a
    • put in an appropriate release message.


Coverting a stack from svn to a git repository

  1. ssh mycroft@skynet
  2. cd internal_git_bare
  3. get a specific folder from svn and make a git repo out of it:
    git svn clone https://svn.hsi.gatech.edu/cckemp/robot1/src/projects/hrl_haptic_manipulation_in_clutter
  4. Convert to a bare repository using steps from here:
    1. cd hrl_haptic_manipulation_in_clutter/
    2. git config --bool core.bare true
    3. rm -rf *
    4. ls -la
      • you should see a .git

Old stuff

  1. git checkout google_code_master
  2. git checkout internal_hrl <path to files to release>
    • got this command from here and here.
    • this will get the files that we want to release, but the history will not be available in the public repository. It will still be available in the internal repository.
  3. git commit -a
    • type in some descriptive release message.
  4. git checkout internal_hrl
    • switch back to the internal_hrl branch
  5. ssh to skynet and push to google code.

To get changes from google code repository

Merge the changes in the google_code_master branch with the internal_hrl branch

  1. git checkout google_code_master
  2. git pull
  3. git checkout internal_hrl
  4. git merge google_code_master

maybe useful commands?

  1. git checkout --track origin/internal_hrl
    • now you will see two branches (master and internal_hrl)
    • usually Advait would expect people to work in the internal_hrl branch

Create bare git repository on internal git server

  1. ssh skynet.hsi.gatech.edu -lmycroft
  2. mkdir internal_git_bare
  3. cd internal_git_bare
  4. Clone gt-ros-pkg with advait as the user on skynet.hsi.gatech.edu:
    git clone https://advaitjain@code.google.com/p/gt-ros-pkg.hrl/
  5. Convert to a bare repository using steps from here:
    1. cd gt-ros-pkg.hrl/
    2. git config --bool core.bare true
    3. rm -rf *
    4. ls -la
      • you should see a .git
  6. git branch -m master internal_hrl
    • rename master to internal_hrl

Add a remote branch to work directly with the google code repository

  1. git remote add -f gt-ros-pkg.hrl_google_code https://code.google.com/p/gt-ros-pkg.hrl/
  2. git checkout -b google_code_master gt-ros-pkg.hrl_google_code/master