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