wiki:UsingGitWithWebKit

Version 32 (modified by yong.li@torchmobile.com, 15 years ago) (diff)

--

Tips and Tricks for using Git with WebKit

Install

You can download Git binaries directly from the official site!

or if you're using Debian:

   sudo apt-get install git-core

or if you're using Fink:

   fink install git

or if you're using MacPorts:

   port install git-core

or if you're using MacPorts and you want to track the svn repository (e.g., a committer):

   port install git-core +svn

or perhaps you'd like to use a 3rd party Mac OS X git install package

or msysgit for windows from google? (Yong)

Checkout

To checkout WebKit using git:

   git clone git://git.webkit.org/WebKit.git WebKit

If you'd also like to track the svn repository (the git update-ref command is the secret to reusing the cloned git repository to fast-forward to the tip of the svn repository):

   cd WebKit
   git update-ref refs/remotes/trunk origin/master
   git svn init -T trunk http://svn.webkit.org/repository/webkit

Updating

If you are tracking the svn repository, this command will fetch information about new commits from svn, reset your local branch to match svn exactly, and then apply your local commits on top:

   git svn rebase

If you are tracking the svn repository, this command will fetch information about new commits from svn:

   git svn fetch

Commit through git svn

If you have been granted commit access to WebKit's svn repository it is possible to work entirely with git and still commit through git svn.

First, you'll need to make sure you have the appropriate remote in your git config:

[svn-remote "svn"]
    url = http://svn.webkit.org/repository/webkit/trunk
    fetch = :refs/remotes/git-svn

Now, you need to update your repo to the latest from the svn repository. You can either:

  • Run 'git svn rebase' which will be incredibly slow...
  • Use the git update-ref trick manually as mentioned above...
  • Use the handy update-gitsvn-from-origin script found in the QtWebKit tools repository here: http://gitorious.org/qtwebkit/tools

After you have a working remote and have fetched all the blobs of info from it you can:

  1. Create a 'tot_staging' branch or whatever name you choose
  2. Apply a patch, cherry-pick a commit, or even merge a branch if it has been reviewed
  3. Run git svn rebase and fix any ChangeLog conflicts that might result
  4. And then when everything is ready: git svn dcommit

WebKit Script support for Git

The various scripts in WebKitTools/Scripts have been made to work pretty well with Git. Here are some of the specific things you can do with them:

  • Telling the various scripts to append the git branch name to every build. This is especially useful so you don't clobber your previous branch's build when you switch branches
      git config core.webKitBranchBuild (true|false) //the default is off
    
  • Overriding the core.webKitBranchBuild setting for a specific branch
      git config branch.$branchName.webKitBranchBuild (true|false)
    
  • Using prepare-Changelog with git
      WebKitTools/Scripts/prepare-ChangeLog --git-commit=$committish --git-reviewer="Foo Reviewer"
    
  • Using resolve-ChangeLog with git. Assuming you got a conflict merging a ChangeLog file, this tool will reapply the patch using patch --fuzz=3 so that your change lands at the top of the ChangeLog file. If the patch was successfully applied, git-add is run on the ChangeLog file. Note that this tool does not change the date of the ChangeLog entry (unlike svn-apply).
      WebKitTools/Scripts/resolve-ChangeLogs path/to/ChangeLog [path/to/ChangeLog ...]
    
  • Using commit-log-editor with git will automatically insert the ChangeLog entry as your commit message (assuming WebKitTools/Scripts is in your path)
      git config core.editor commit-log-editor
    
    If you want to make sure log gets regenerated from ChangeLog entry each time you modify an already existing commit, use --regenerate-log:
      git config core.editor "commit-log-editor --regenerate-log"
    
  • If you do not manually generate a ChangeLog entry and you have staged changes in your working tree, commit-log-editor will automatically generate a commit message in the WebKit ChangeLog entry format when you do 'git commit'. You can control this behaviour with the git configuration option webkitGenerateCommitMessage on a global or per-branch basis.
      git config core.webkitGenerateCommitMessage (true|false) //the default is true
      git config branch.$branchName.webkitGenerateCommitMessage (true|false)
    

Misc. Tips and Tricks

  • You can setup Git shell completion and branch name in your bash prompt. In your /path/to/git/source/contrib/completion directory you will find a 'git-completion.bash' file. Follow the instructions in that file to enable shell completion. Here is a nice bash prompt for instance
    PS1='\[\033[41;1;37m\]\u@\h:\[\033[40;1;33m\]\W$(__git_ps1 " (%s)")>\[\033[0m\] '
    
  • You can set up multiple working directories to work on more than one branch at a time. In your /path/to/git/source/contrib/workdir directory you will find a 'git-new-workdir' script that can create new working directories. The usage is
    ./git-new-workdir <repository> <new_workdir> [<branch>]
    
  • Colorize various git commands
    git config --global color.status auto
    git config --global color.diff auto
    git config --global color.branch auto
    
  • Important git config settings
    git config --global user.name "Foo Bar"
    git config --global user.email "foo@webkit.org"
    
  • Install WebKit project-specific git scripts
     git clone git://git.ndesk.org/pub/scm/git-porcelains
     cd git-porcelains
     make
    

Note: git-send-bugzilla requires Crypt::SSLeay

More info @ http://git.ndesk.org/?p=git-porcelains;a=summary

Ignores

  • You can setup your git repository to ignore the same files that are ignored in the tracked svn repository with: (this will take some time)
    git svn show-ignore >> .git/info/exclude