• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Using Gerrit without git-cl
2===========================
3
4setup
5-----
6
7The following must be executed within the Skia source repository.
8
9This command sets up a Git commit-message hook to add a unique Change-Id to
10each commit.  Gerrit only accepts changes with a Change-Id and uses it to
11identify 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
17If you aquired Skia from a mirror (such as github), you need to change the
18`origin` remote to point to point to googlesource.  Advanvced uses will note
19that there is nothing special about the string `origin` and that you could call
20this 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
25creating a change
26-----------------
27
281.  Create a topic branch
29
30        git checkout -b TOPIC
31
32    You may want to set a tracking branch at this time with:
33
34        git checkout -b TOPIC -t origin/master
35
362.  Make a commit.
37
38        echo FOO >> whitespace.txt
39        git commit --all --message 'Change Foo'
40        git log -1
41
42    `git log` should show that a Change-Id line has been added you your commit
43    message.
44
45
463.  If You have multiple commits in your branch, Gerrit will think you want
47    multiple changes that depend on each other.  If this is not what you want,
48    you need to squash the commits.
49
504.  Push to Gerrit
51
52        git push origin @:refs/for/master
53
54    `@` is shorthand for `HEAD`, introduced in git v1.8.5.
55
56    If you want to target a branch other than `master`, that can be specified
57    here, too.  For example:
58
59        git push origin @:refs/for/chrome/m57
60
61    [Gerrit Upload Documentation](https://gerrit-review.googlesource.com/Documentation/user-upload.html)
62
63
64updating a change
65-----------------
66
67
681.  Edit your commits more.
69
70        echo BAR >> whitespace.txt
71        git commit --all --amend
72
73    Changes to the commit message will be sent with the push as well.
74
75
762.  Re-squash if needed.  (Not needed if you only amended your original commit.)
77
78
793.  Push to Gerrit.
80
81        git push origin @:refs/for/master
82
83    If you want to set a comment message for this patch set, do this instead:
84
85        git push origin @:refs/for/master%m=this_is_the_patch_set_comment_message
86
87    The title of this patch set will be "this is the patch set comment message".
88
89
90scripting
91---------
92
93You may want to make git aliases for common tasks:
94
95    git config alias.gerrit-push 'push origin @:refs/for/master'
96
97The following alias amends the head without editing the commit message:
98
99    git config alias.amend-head 'commit --all --amend --reuse-message=@'
100
101The following shell script will squash all commits on the current branch,
102assuming that the branch has an upstream topic branch.
103
104    squash_git_branch() {
105        local MESSAGE="$(git log --format=%B ^@{upstream} @)"
106        git reset --soft $(git merge-base @ @{upstream})
107        git commit -m "$MESSAGE" -e
108    }
109
110This shell script pushes to gerrit and adds a message to a patchset:
111
112    gerrit_push_with_message() {
113        local REMOTE='origin'
114        local REMOTE_BRANCH='master'
115        local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
116        git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
117    }
118
119These shell scripts can be turned into Git aliases with a little hack:
120
121    git config alias.squash-branch '!M="$(git log --format=%B ^@{u} @)";git reset --soft $(git merge-base @ @{u});git commit -m "$M" -e'
122
123    git config alias.gerrit-push-message '!f(){ git push origin @:refs/for/master%m=$(echo $*|sed "s/[^A-Za-z0-9]/_/g");};f'
124
125If your branch's upstream branch (set with `git branch --set-upstream-to=...`)
126is set, you can use that to automatically push to that branch:
127
128    gerrit_push_upstream() {
129        local UPSTREAM_FULL="$(git rev-parse --symbolic-full-name @{upstream})"
130        case "$UPSTREAM_FULL" in
131            (refs/remotes/*);;
132            (*) echo "Set your remote upstream branch."; return 2;;
133        esac
134        local UPSTREAM="${UPSTREAM_FULL#refs/remotes/}"
135        local REMOTE="${UPSTREAM%%/*}"
136        local REMOTE_BRANCH="${UPSTREAM#*/}"
137        local MESSAGE="$(echo $*|sed 's/[^A-Za-z0-9]/_/g')"
138        echo git push $REMOTE @:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}
139        git push "$REMOTE" "@:refs/for/${REMOTE_BRANCH}%m=${MESSAGE}"
140    }
141
142As a Git alias:
143
144    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'
145
146