[[PageOutline]] = Tips and Tricks for using Git with WebKit = * [wiki:"Moving to Git" Proposal for moving WebKit development to Git] == Install == You can download Git binaries directly from the [http://git-scm.com/download official site!] or if you're using [http://www.debian.org Debian]: {{{ sudo apt-get install git-core }}} or if you're using [http://www.finkproject.org/ Fink]: {{{ fink install git }}} or if you're using [http://www.macports.org/ MacPorts]: {{{ port install git-core }}} or if you're using [http://www.macports.org/ 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 [http://metastatic.org/text/Concern/2007/09/15/new-git-package-for-os-x/ git install package] == 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 [] }}} * 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 }}}