Git

From KevinWiki

Revision as of 18:34, 7 January 2013 by Kevin (Talk | contribs)
Jump to: navigation, search

Contents

Git

Client-side Installation

In the client,

$ apt-get install git-core 

Configuration

User Info

$ git config --global user.name "GivenName Surname" 
$ git config --global user.email user@email.address 

Default Text Editor

$ git config --global core.editor "sublime-text -w"

External Diff Tool

Using Meld As Diff Tool

  • To use Meld as a diff tool, install Meld
$ sudo apt-get install meld 
  • Set it as the default diff tool
$ git config --global diff.external meld 
  • It doesn't work and gives the following error messages.
$ git diff 
Usage: 
  meld                        Start with an empty window
  meld <file|dir>             Start a version control comparison
  meld <file> <file> [<file>] Start a 2- or 3-way file comparison
  meld <dir> <dir> [<dir>]    Start a 2- or 3-way directory comparison
  meld <file> <dir>           Start a comparison between file and dir/file

meld: error: too many arguments (wanted 0-4, got 7)
  • Create ~/diff.py
#!/usr/bin/python

import sys
import os

os.system('meld "%s" "%s"' % (sys.argv[2], sys.argv[5]))
  • Make it executable
$ chmod a+x ~/diff.py 
  • Set the script as the diff tool
$ git config --global diff.external ~/diff.py 
  • Now it works
$ git diff 
$ git diff HEAD 


Commit Template

Create a template file
e.g.) $HOME/git/.your-config/git-commit-comment-template.txt

CLOSED - #TICKET_NUMBER: Summary
TICKET_URI
Details
$ git config --global commit.template $HOME/git/.your-config/git-commit-comment-template.txt 


Etc.

$ git config --global color.ui true

Server-side Installation

In the server,

$ apt-get install git 

Gitolite

Add User to Manage Gitolite

  1. Add user to manage gitolite
$ adduser \
  --system \
  --shell /bin/bash \
  --gecos 'git version control' \
  --group \
  --disabled-password \
  --home /home/git \
  git

Adding system user `git' (UID 108) ...
Adding new group `git' (GID 110) ...
Adding new user `git' (UID 108) with group `git' ...
Creating home directory `/home/git' ...

Create SSH key

$ ssh-keygen -t rsa 

/home/username/.ssh/some_git_rsa [ENTER] [ENTER]

Transfer SSH Keys to Server

$ ssh-copy-id '-p PORT_NUMBER -i /home/user/.ssh/some_git_rsa.pub git_user@host' 

If it doesn't work because the user is the only user who can access the server with his/her ssh key so accessing with git_user doesn't work.

$ scp -P PORT ~/.ssh/some_git_rsa.pub user@host: 

Log in with the user account

$ ssh -p PORT user@host
$ mv some_git_rsa.pub git.pub 

Setup

$ su - git 
$ cd ~ 
$ echo "PATH=$HOME/bin:$PATH" >> ~/.bashrc 
  • don't need these 2 lines
$ mkdir .ssh 
$ cat /home/user/git.pub >> /home/git/.ssh/authorized_keys 
$ exit

Gitolite Installation

$ sudo -i 
$ apt-get install gitolite
[ENTER] -> :q to exit
$ exit

Setup git User

$ su - git
$ gl-setup /home/user/git.pub 
$ vim /etc/ssh/sshd_config 

Add git to the allowed user

AllowUsers user git

Restart ssh

$ service ssh restart 

Test

  • Testing (from user local machine)
$ ssh -p PORT_NUMBER git@host 

Having many keys?

$ ssh -p PORT_NUMBER -i ~/.ssh/user@host1.pub git@host 

For debugging

$ ssh -p PORT_NUMBER -vT git@host 
$ mkdir some-dir 
$ cd some-dir 
$ git clone git@host:gitolite-admin 

Or if you use a specific port,

$ git clone ssh://git@host:PORT_NUMBER/gitolite-admin

Add Git User (through Gitolite)

Adding User

$ cd gitolite-admin/keydir 
$ mkdir user_name 
$ cp -p ~/.ssh/user@host1.pub .
$ cp -p ~/.ssh/user@host2.pub .
$ git add user@host1.pub 
$ git commit -a -m "users added: user@host1 and user@host2" 
$ git push

If directly copied to /home/git/.gitolite/keydir, run

$ gl-setup

to apply the changes

Usage

Host Info Config using SSH_Config

Create ~/.ssh/config file and edit.

Host host.name
  Hostname host.name
  Port 1111

Host another.host.name
  Hostname another.host.name
  Port 2222

Host host1
  Hostname host.name
  Port 1111
  User git
  IdentityFile ~/.ssh/git_rsa

Host user-host2
  Hostname host2.name
  Port 1234
  User user
  IdentityFile ~/.ssh/user@localhost1

Host user-host3
  Hostname host3.com
  Port 1122
  User user
  IdentityFile ~/.ssh/user@localhost1

IdentityFile is a private key

To use this info,

$ git clone git@host1:repo-name 
# it will use 'git' as a user and access the server 'host.name' using the port nubmer 1111.
$ git clone git@host1:repo-name 
# it will use 'user' as a user and access the server 'host2.name' using the port nubmer 1234.

Push to Specific Host

$ git push git@host1:repo-name master

Set up Project Specific User Info

  • Move to the project repository
$ git config user.email user@email.address 

To see and edit all the config details

$ git config -e

.gitignore

To exclude files when committing, create .gitignore file and put in the project root (git project repo root). For maven project, the content should be

target/

To set up the global ignore file

$ git config --global core.excludesfile $HOME/git/.your-config/.global-gitignore 

Other gitignore files,

https://github.com/github/gitignore


.gitignore for Eclipse and Maven (for Kevin)

target/

*.pydevproject
.project
.classpath
.settings/
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.loadpath

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath


Commit

  • Add file
$ git add fileName
  • Commit
$ git commit -m "comment"
  • Add all the files and folders
$ git add -A 
# It is equivalent to git add .; git add -u
# git add . -> add all changed and new ones but not removed ones
# git add -u -> changed and removed but not new ones.

Amend Last Comment

  • Amend the last comment
$ git commit --amend -m "New comment"


Push

  • Push to the remote git repository
$ git push
  • If it gives error messages like:
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
  • Do
$ git push origin master

Revert

Reset

  • Revert to last commit.
$ git reset --hard HEAD 

Or to specific commit/tag/branch

$ git reset --hard <tag/branch/commit id> 
  • Check the id using git log
$ git log 
  • To push it
$ git push <reponame> -f 

Check out

  • Or change the name of master branch then check out from the commit to be used and make it master
  1. Rename the current master branch
    $ git branch -m another_name_for_master 
  2. Check out from another commit:
     $ git checkout a1b2c3a3blah 
  3. Make it the new master branch:
     $ git checkout -b master 
  • If the old master is no longer needed and has to be removed, remove it by
$ git branch -D another_name_for_master

Migration from SVN to Git

Install git-svn

$ apt-get install git-svn 

Prepare for Migration

In some dir, create users.txt having all the user info e.g.)

USERNAME = FirstName LastName <user@host>

Migrate

Without Tags

$ git svn clone --stdlayout --no-metadata -A users.txt --username=USERNAME https://svn.repo/some-parent-folder/project-folder project-tmp 

(https://svn.repo/some-parent-folder/project-folder <- Not trunk)

$ cd project-tmp 
$ git svn fetch 
  • To view the other SVN branches
$ git branch -r
$ cd ..
$ git clone project-tmp project 
$ rm -Rf project-tmp 
$ cd project 
$ git remote rm origin 
  • Before this, add git repo for the project first.
$ git remote add origin git@git-repo:project 
  • To view all remote
$ git remote -v 
$ git config branch.master.remote origin 
$ git config branch.master.merge refs/heads/master 


  • add user info to project/.git/config
[user]
  email = user@host
$ git push -u origin master 
  • Check status
$ git status 
# On branch master
nothing to commit (working directory clean)


With Tags

If there are nested tag folders like tags/released/1.x/1.1.0, tags/released/1.x/1.2.0, tags/released/1.x/1.3.0, tags/released/2.x/2.0.1 and tags/released/2.x/2.2.0, add --tags (for branches, it's --branches)

$ git svn clone --stdlayout --tags=tags/*/*/* --no-metadata -A users.txt --username=USERNAME https://svn.repo/some-parent-folder/project-folder project 
$ cd project
$ git svn fetch 
#### not necessary as it's handled different (by create tag and remove the svn tag) 
$ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 
$ rm -Rf .git/refs/remotes/tags 

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ 
$ rm -Rf .git/refs/remotes 
###################################################################################
$ git branch -r

Then for each tag listed do:

$ git tag tagname tags/tagname
$ git branch -r -d tags/tagname
$ git tag tag-name-for-git tags/tag-name-from-svn
$ git branch -r -d tags/tag-name-from-svn

e.g.)

$ git tag 0.1.15 tags/released/0.x/some-app-0.1.15
$ git branch -r -d tags/released/0.x/some-app-0.1.15
  • list tags
$ git tag -l
  • remove old svn tags
$ rm -Rf .git/refs/remotes/tags 
$ git remote add origin git@git-repo:project 
* add user info to project/.git/config 
$ git config -e
[user]
  email = user@host

and remove [svn-remote "svn"] and [svn]

$ git push origin --all 

It doesn't seem like the tags are pushed?

$ git push origin --tags
Retrieved from "http://kevinlee.io/wiki/Git"
Personal tools