Home | History | Annotate | Download | only in documentation
      1 Using Gerrit without git-cl
      2 ===========================
      3 
      4 Setup
      5 -----
      6 
      7 The following must be executed within the Skia source repository.
      8 
      9 This command sets up a Git commit-message hook to add a unique Change-Id to
     10 each commit.  Gerrit only accepts changes with a Change-Id and uses it to
     11 identify which review a change applies to.
     12 
     13     curl -Lo "$(git rev-parse --git-dir)/hooks/commit-msg"
     14       'https://gerrit-review.googlesource.com/tools/hooks/commit-msg'
     15     chmod +x "$(git rev-parse --git-dir)/hooks/commit-msg"
     16 
     17 If you acquired Skia from a mirror (such as github), you need to change the
     18 `origin` remote to point to point to googlesource.  Advanced uses will note
     19 that there is nothing special about the string `origin` and that you could call
     20 this remote anything you want, as long as you use that name for `get push`.
     21 
     22     git remote set-url origin 'https://skia.googlesource.com/skia.git'
     23 
     24 
     25 Authentication
     26 --------------
     27 
     28 Go to [skia.googlesource.com/new-password](https://skia.googlesource.com/new-password)
     29 and follow the instructions.
     30 
     31 
     32 Creating a Change
     33 -----------------
     34 
     35 1.  Create a topic branch
     36 
     37         git checkout -b TOPIC
     38 
     39     You may want to set a tracking branch at this time with:
     40 
     41         git checkout -b TOPIC -t origin/master
     42 
     43 2.  Make a commit.
     44 
     45         echo FOO >> whitespace.txt
     46         git commit --all --message 'Change Foo'
     47         git log -1
     48 
     49     `git log` should show that a Change-Id line has been added you your commit
     50     message.
     51 
     52 
     53 3.  If You have multiple commits in your branch, Gerrit will think you want
     54     multiple changes that depend on each other.  If this is not what you want,
     55     you need to squash the commits.
     56 
     57 4.  Push to Gerrit
     58 
     59         git push origin @:refs/for/master
     60 
     61     `@` is shorthand for `HEAD`, introduced in git v1.8.5.
     62 
     63     If you want to target a branch other than `master`, that can be specified
     64     here, too.  For example:
     65 
     66         git push origin @:refs/for/chrome/m57
     67 
     68     [Gerrit Upload Documentation](https://gerrit-review.googlesource.com/Documentation/user-upload.html)
     69 
     70 5.  Open in web browser:
     71 
     72         bin/sysopen https://skia-review.googlesource.com/c/skia/+/$(bin/gerrit-number @)
     73 
     74 Updating a Change
     75 -----------------
     76 
     77 
     78 1.  Edit your commits more.
     79 
     80         echo BAR >> whitespace.txt
     81         git commit --all --amend
     82 
     83     Changes to the commit message will be sent with the push as well.
     84 
     85 
     86 2.  Re-squash if needed.  (Not needed if you only amended your original commit.)
     87 
     88 
     89 3.  Push to Gerrit.
     90 
     91         git push origin @:refs/for/master
     92 
     93     If you want to set a comment message for this patch set, do this instead:
     94 
     95         git push origin @:refs/for/master%m=this_is_the_patch_set_comment_message
     96 
     97     The title of this patch set will be "this is the patch set comment message".
     98 
     99 
    100 Using `git cl try`
    101 ------------------
    102 
    103 On your current branch, after uploading to gerrit:
    104 
    105     git cl issue $(bin/gerrit-number @)
    106 
    107 Now `git cl try` and `bin/try` will work correctly.
    108 
    109 
    110 Scripting
    111 ---------
    112 
    113 You may want to make git aliases for common tasks:
    114 
    115     git config alias.gerrit-push 'push origin @:refs/for/master'
    116 
    117 The following alias amends the head without editing the commit message:
    118 
    119     git config alias.amend-head 'commit --all --amend --reuse-message=@'
    120 
    121 Set the CL issue numnber:
    122 
    123     git config alias.setcl '!git-cl issue $(bin/gerrit-number @)'
    124 
    125 The following shell script will squash all commits on the current branch,
    126 assuming that the branch has an upstream topic branch.
    127 
    128     squash_git_branch() {
    129         local MESSAGE="$(git log --format=%B ^@{upstream} @)"
    130         git reset --soft $(git merge-base @ @{upstream})
    131         git commit -m "$MESSAGE" -e
    132     }
    133 
    134 This shell script pushes to gerrit and adds a message to a patchset:
    135 
    136     gerrit_push_with_message() {
    137         local REMOTE='origin'
    138         local REMOTE_BRANCH='master'
    139         local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
    140         git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
    141     }
    142 
    143 These shell scripts can be turned into Git aliases with a little hack:
    144 
    145     git config alias.squash-branch '!M="$(git log --format=%B ^@{u} @)";git reset --soft $(git merge-base @ @{u});git commit -m "$M" -e'
    146 
    147     git config alias.gerrit-push-message '!f(){ git push origin @:refs/for/master%m=$(echo $*|sed "s/[^A-Za-z0-9]/_/g");};f'
    148 
    149 If your branch's upstream branch (set with `git branch --set-upstream-to=...`)
    150 is set, you can use that to automatically push to that branch:
    151 
    152     gerrit_push_upstream() {
    153         local UPSTREAM_FULL="$(git rev-parse --symbolic-full-name @{upstream})"
    154         case "$UPSTREAM_FULL" in
    155             (refs/remotes/*);;
    156             (*) echo "Set your remote upstream branch."; return 2;;
    157         esac
    158         local UPSTREAM="${UPSTREAM_FULL#refs/remotes/}"
    159         local REMOTE="${UPSTREAM%%/*}"
    160         local REMOTE_BRANCH="${UPSTREAM#*/}"
    161         local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
    162         echo git push $REMOTE @:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}
    163         git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
    164     }
    165 
    166 As a Git alias:
    167 
    168     git config alias.gerrit-push '!f()(F="$(git rev-parse --symbolic-full-name @{u})";case "$F" in (refs/remotes/*);;(*)echo "Set your remote upstream branch.";return 2;;esac;U="${F#refs/remotes/}";R="${U%%/*}";B="${U#*/}";M="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')";echo git push $R @:refs/for/${B}%m=$M;git push "$R" "@:refs/for/${B}%m=$M");f'
    169 
    170