README.md 10.9 KB
Newer Older
M
Mislav Marohnić 已提交
1 2
git + hub = github
==================
C
readme  
Chris Wanstrath 已提交
3

M
Mislav Marohnić 已提交
4 5
hub is a command line tool that wraps `git` in order to extend it with extra
features and commands that make working with GitHub easier.
C
readme  
Chris Wanstrath 已提交
6

M
Mislav Marohnić 已提交
7 8
~~~ sh
$ hub clone rtomayko/tilt
C
readme  
Chris Wanstrath 已提交
9

M
Mislav Marohnić 已提交
10 11 12
# expands to:
$ git clone git://github.com/rtomayko/tilt.git
~~~
C
Chris Wanstrath 已提交
13

M
Mislav Marohnić 已提交
14 15
hub is best aliased as `git`, so you can type `$ git <command>` in the shell and
get all the usual `hub` features. See "Aliasing" below.
C
tweak  
Chris Wanstrath 已提交
16

C
Chris Wanstrath 已提交
17

M
Mislav Marohnić 已提交
18 19
Installation
------------
C
Chris Wanstrath 已提交
20

M
Mislav Marohnić 已提交
21
Dependencies:
C
Chris Wanstrath 已提交
22

M
Mislav Marohnić 已提交
23 24
* **git 1.7.3** or newer
* **Ruby 1.8.6** or newer
C
tweak  
Chris Wanstrath 已提交
25

M
Mislav Marohnić 已提交
26
### Homebrew
C
tweaks  
Chris Wanstrath 已提交
27

M
Mislav Marohnić 已提交
28
Installing on OS X is easiest with Homebrew:
C
readme  
Chris Wanstrath 已提交
29

M
Mislav Marohnić 已提交
30 31 32
~~~ sh
$ brew install hub
~~~
C
readme  
Chris Wanstrath 已提交
33

C
Chris Wanstrath 已提交
34 35
### Standalone

M
Mislav Marohnić 已提交
36
`hub` is easily installed as a standalone script:
C
Chris Wanstrath 已提交
37

M
Mislav Marohnić 已提交
38 39 40 41
~~~ sh
$ curl http://defunkt.io/hub/standalone -sLo ~/bin/hub &&
  chmod +x ~/bin/hub
~~~
C
Chris Wanstrath 已提交
42

M
Mislav Marohnić 已提交
43
Assuming "~/bin/" is in your `$PATH`, you're ready to roll:
C
Chris Wanstrath 已提交
44

M
Mislav Marohnić 已提交
45 46 47 48 49
~~~ sh
$ hub version
git version 1.7.6
hub version 1.8.3
~~~
50

51 52 53 54 55 56 57 58 59
#### On Windows

If you have mysysgit, open "Git Bash" and follow the steps above but put the
`hub` executable in `/bin` instead of `~/bin`.

Avoid aliasing hub as `git` due to the fact that mysysgit automatically
configures your prompt to include git information, and you want to avoid slowing
that down. See [Is your shell prompt slow?](#is-your-shell-prompt-slow)

60
### RubyGems
C
Chris Wanstrath 已提交
61

M
Mislav Marohnić 已提交
62
Though not recommended, hub can also be installed as a RubyGem:
C
Chris Wanstrath 已提交
63

M
Mislav Marohnić 已提交
64 65 66
~~~ sh
$ gem install hub
~~~
C
Chris Wanstrath 已提交
67

68 69
(It's not recommended for casual use because of the RubyGems startup
time. See [this gist][speed] for information.)
70

M
Mislav Marohnić 已提交
71
#### Standalone via RubyGems
72

M
Mislav Marohnić 已提交
73 74 75 76
~~~ sh
$ gem install hub
$ hub hub standalone > ~/bin/hub && chmod +x ~/bin/hub
~~~
77 78

This installs a standalone version which doesn't require RubyGems to
M
Mislav Marohnić 已提交
79
run, so it's faster.
80

C
Chris Wanstrath 已提交
81 82
### Source

C
Chris Wanstrath 已提交
83
You can also install from source:
C
readme  
Chris Wanstrath 已提交
84

M
Mislav Marohnić 已提交
85 86
~~~ sh
$ git clone git://github.com/defunkt/hub.git
87 88
$ cd hub
$ rake install prefix=/usr/local
M
Mislav Marohnić 已提交
89
~~~
C
readme  
Chris Wanstrath 已提交
90

91
### Help! It's slow!
C
Chris Wanstrath 已提交
92

93
#### Is `hub` noticeably slower than plain git?
C
Chris Wanstrath 已提交
94

95 96
That is inconvenient, especially if you want to alias hub as `git`. Few things
you can try:
C
Chris Wanstrath 已提交
97

98
* Find out which ruby is used for the hub executable:
C
Chris Wanstrath 已提交
99

100 101 102
    ``` sh
    head -1 `which hub`
    ```
C
Chris Wanstrath 已提交
103

104
* That ruby should be speedy. Time it with:
C
Chris Wanstrath 已提交
105

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    ``` sh
    time /usr/bin/ruby -e0
    #=> it should be below 0.01 s total
    ```

* Check that Ruby isn't loading something shady:

    ``` sh
    echo $RUBYOPT
    ```

* Check your [GC settings][gc]

General recommendation: you should change hub's shebang line to run with system
ruby (usually `/usr/bin/ruby`) instead of currently active ruby (`/usr/bin/env
ruby`). Also, Ruby 1.8 is speedier than 1.9.

#### Is your shell prompt slow?

Does your prompt show git information? Hub may be slowing down your prompt.

This can happen if you've aliased hub as `git`. This is fine when you use `git`
manually, but may be unacceptable for your prompt, which doesn't need hub
features anyway!

The solution is to identify which shell functions are calling `git`, and replace
each occurrence of that with `command git`. This is a shell feature that enables
you to call a command directly and skip aliases and functions wrapping it.
C
Chris Wanstrath 已提交
134

C
readme  
Chris Wanstrath 已提交
135

C
Chris Wanstrath 已提交
136 137
Aliasing
--------
C
readme  
Chris Wanstrath 已提交
138

M
Mislav Marohnić 已提交
139 140
Using hub feels best when it's aliased as `git`. This is not dangerous; your
_normal git commands will all work_. hub merely adds some sugar.
C
readme  
Chris Wanstrath 已提交
141

142 143
`hub alias` displays instructions for the current shell. With the `-s` flag, it
outputs a script suitable for `eval`.
C
Chris Wanstrath 已提交
144

145
You should place this command in your `.bash_profile` or other startup script:
C
Chris Wanstrath 已提交
146

M
Mislav Marohnić 已提交
147
~~~ sh
148
eval "$(hub alias -s)"
M
Mislav Marohnić 已提交
149
~~~
C
tweaks  
Chris Wanstrath 已提交
150

151 152 153 154 155 156 157 158
### Shell tab-completion

hub repository contains tab-completion scripts for bash and zsh. These scripts
complement existing completion scripts that ship with git.

* [hub bash completion](https://github.com/defunkt/hub/blob/master/etc/hub.bash_completion.sh)
* [hub zsh completion](https://github.com/defunkt/hub/blob/master/etc/hub.zsh_completion)

C
readme  
Chris Wanstrath 已提交
159

C
Chris Wanstrath 已提交
160
Commands
C
readme  
Chris Wanstrath 已提交
161 162
--------

M
Mislav Marohnić 已提交
163
Assuming you've aliased hub as `git`, the following commands now have
C
Chris Wanstrath 已提交
164 165
superpowers:

C
readme  
Chris Wanstrath 已提交
166 167 168
### git clone

    $ git clone schacon/ticgit
C
Chris Wanstrath 已提交
169 170
    > git clone git://github.com/schacon/ticgit.git

C
readme  
Chris Wanstrath 已提交
171
    $ git clone -p schacon/ticgit
C
Chris Wanstrath 已提交
172
    > git clone git@github.com:schacon/ticgit.git
C
readme  
Chris Wanstrath 已提交
173

174
    $ git clone resque
175
    > git clone git@github.com/YOUR_USER/resque.git
176

C
readme  
Chris Wanstrath 已提交
177 178 179
### git remote add

    $ git remote add rtomayko
C
Chris Wanstrath 已提交
180 181
    > git remote add rtomayko git://github.com/rtomayko/CURRENT_REPO.git

K
Konstantin Haase 已提交
182
    $ git remote add -p rtomayko
C
Chris Wanstrath 已提交
183
    > git remote add rtomayko git@github.com:rtomayko/CURRENT_REPO.git
C
readme  
Chris Wanstrath 已提交
184

185 186 187
    $ git remote add origin
    > git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git

188 189 190 191 192 193 194 195 196 197 198
### git fetch

    $ git fetch mislav
    > git remote add mislav git://github.com/mislav/REPO.git
    > git fetch mislav

    $ git fetch mislav,xoebus
    > git remote add mislav ...
    > git remote add xoebus ...
    > git fetch --multiple mislav xoebus

199 200 201 202 203 204 205 206 207 208 209 210 211 212
### git cherry-pick

    $ git cherry-pick http://github.com/mislav/REPO/commit/SHA
    > git remote add -f mislav git://github.com/mislav/REPO.git
    > git cherry-pick SHA

    $ git cherry-pick mislav@SHA
    > git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
    > git cherry-pick SHA

    $ git cherry-pick mislav@SHA
    > git fetch mislav
    > git cherry-pick SHA

213
### git am, git apply
214 215 216 217 218 219 220 221 222

    $ git am https://github.com/defunkt/hub/pull/55
    > curl https://github.com/defunkt/hub/pull/55.patch -o /tmp/55.patch
    > git am /tmp/55.patch

    $ git am --ignore-whitespace https://github.com/davidbalbert/hub/commit/fdb9921
    > curl https://github.com/davidbalbert/hub/commit/fdb9921.patch -o /tmp/fdb9921.patch
    > git am --ignore-whitespace /tmp/fdb9921.patch

223 224 225 226
    $ git apply https://gist.github.com/8da7fb575debd88c54cf
    > curl https://gist.github.com/8da7fb575debd88c54cf.txt -o /tmp/gist-8da7fb575debd88c54cf.txt
    > git apply /tmp/gist-8da7fb575debd88c54cf.txt

227 228 229
### git fork

    $ git fork
230
    [ repo forked on GitHub ]
C
Chris Wanstrath 已提交
231
    > git remote add -f YOUR_USER git@github.com:YOUR_USER/CURRENT_REPO.git
232

233 234
### git pull-request

235
    # while on a topic branch called "feature":
236 237
    $ git pull-request
    [ opens text editor to edit title & body for the request ]
238
    [ opened pull request on GitHub for "YOUR_USER:feature" ]
239

240
    # explicit title, pull base & head:
241
    $ git pull-request -m "Implemented feature X" -b defunkt:master -h mislav:feature
242

M
Mislav Marohnić 已提交
243
    $ git pull-request -i 123
244
    [ attached pull request to issue #123 ]
245

246 247
### git checkout

248 249 250
    $ git checkout https://github.com/defunkt/hub/pull/73
    > git remote add -f -t feature git://github:com/mislav/hub.git
    > git checkout --track -B mislav-feature mislav/feature
251

252 253 254 255 256 257 258
    $ git checkout https://github.com/defunkt/hub/pull/73 custom-branch-name

### git merge

    $ git merge https://github.com/defunkt/hub/pull/73
    > git fetch git://github.com/mislav/hub.git +refs/heads/feature:refs/remotes/mislav/feature
    > git merge mislav/feature --no-ff -m 'Merge pull request #73 from mislav/feature...'
259

260 261 262
### git create

    $ git create
263
    [ repo created on GitHub ]
264 265
    > git remote add origin git@github.com:YOUR_USER/CURRENT_REPO.git

266 267 268 269 270 271 272 273 274 275 276
    # with description:
    $ git create -d 'It shall be mine, all mine!'

    $ git create recipes
    [ repo created on GitHub ]
    > git remote add origin git@github.com:YOUR_USER/recipes.git

    $ git create sinatra/recipes
    [ repo created in GitHub organization ]
    > git remote add origin git@github.com:sinatra/recipes.git

C
readme  
Chris Wanstrath 已提交
277 278
### git init

C
Chris Wanstrath 已提交
279
    $ git init -g
C
Chris Wanstrath 已提交
280
    > git init
281
    > git remote add origin git@github.com:YOUR_USER/REPO.git
C
Chris Wanstrath 已提交
282

283 284 285 286 287 288 289
### git push

    $ git push origin,staging,qa bert_timeout
    > git push origin bert_timeout
    > git push staging bert_timeout
    > git push qa bert_timeout

290 291
### git browse

292
    $ git browse
J
Justin Quick 已提交
293
    > open https://github.com/YOUR_USER/CURRENT_REPO
294

295 296 297
    $ git browse -- commit/SHA
    > open https://github.com/YOUR_USER/CURRENT_REPO/commit/SHA

298
    $ git browse -- issues
J
Justin Quick 已提交
299
    > open https://github.com/YOUR_USER/CURRENT_REPO/issues
300

301
    $ git browse schacon/ticgit
302
    > open https://github.com/schacon/ticgit
303

304 305 306
    $ git browse schacon/ticgit commit/SHA
    > open https://github.com/schacon/ticgit/commit/SHA

307
    $ git browse resque
308
    > open https://github.com/YOUR_USER/resque
309

310
    $ git browse resque network
311
    > open https://github.com/YOUR_USER/resque/network
312

J
Joshua Roesslein 已提交
313 314 315
### git compare

    $ git compare refactor
316
    > open https://github.com/CURRENT_REPO/compare/refactor
J
Joshua Roesslein 已提交
317

318
    $ git compare 1.0..1.1
319
    > open https://github.com/CURRENT_REPO/compare/1.0...1.1
J
Joshua Roesslein 已提交
320 321

    $ git compare -u fix
322
    > (https://github.com/CURRENT_REPO/compare/fix)
J
Joshua Roesslein 已提交
323

324
    $ git compare other-user patch
325
    > open https://github.com/other-user/REPO/compare/patch
J
Joshua Roesslein 已提交
326

J
Justin Ridgewell 已提交
327
### git submodule
328

J
Justin Ridgewell 已提交
329 330 331 332 333 334
    $ hub submodule add wycats/bundler vendor/bundler
    > git submodule add git://github.com/wycats/bundler.git vendor/bundler

    $ hub submodule add -p wycats/bundler vendor/bundler
    > git submodule add git@github.com:wycats/bundler.git vendor/bundler

335 336
    $ hub submodule add -b ryppl --name pip ryppl/pip vendor/pip
    > git submodule add -b ryppl --name pip git://github.com/ryppl/pip.git vendor/pip
J
Justin Ridgewell 已提交
337

338 339
### git ci-status

M
Mislav Marohnić 已提交
340 341
    $ hub ci-status [commit]
    > (prints CI state of commit and exits with appropriate code)
342 343
    > One of: success (0), error (1), failure (1), pending (2), no status (3)

J
Justin Ridgewell 已提交
344

C
Chris Wanstrath 已提交
345 346 347 348
### git help

    $ git help
    > (improved git help)
C
Chris Wanstrath 已提交
349 350
    $ git help hub
    > (hub man page)
C
readme  
Chris Wanstrath 已提交
351 352


M
Mislav Marohnić 已提交
353 354 355
Configuration
-------------

356
### GitHub OAuth authentication
C
Chris Wanstrath 已提交
357

358 359
Hub will prompt for GitHub username & password the first time it needs to access
the API and exchange it for an OAuth token, which it saves in "~/.config/hub".
C
Chris Wanstrath 已提交
360

B
Bruno Binet 已提交
361
### HTTPS instead of git protocol
C
Chris Wanstrath 已提交
362

363 364
If you prefer using the HTTPS protocol for GitHub repositories instead of the git
protocol for read and ssh for write, you can set "hub.protocol" to "https".
C
Chris Wanstrath 已提交
365

M
Mislav Marohnić 已提交
366 367 368 369
~~~ sh
# default behavior
$ git clone defunkt/repl
< git clone >
C
Chris Wanstrath 已提交
370

M
Mislav Marohnić 已提交
371 372 373 374 375
# opt into HTTPS:
$ git config --global hub.protocol https
$ git clone defunkt/repl
< https clone >
~~~
C
readme  
Chris Wanstrath 已提交
376 377


C
Chris Wanstrath 已提交
378 379 380
Contributing
------------

381
These instructions assume that _you already have hub installed_ and aliased as
M
Mislav Marohnić 已提交
382
`git` (see "Aliasing").
M
Mislav Marohnić 已提交
383 384

1. Clone hub:  
M
Mislav Marohnić 已提交
385
    `git clone defunkt/hub && cd hub`
386 387
1. Ensure Bundler is installed:  
    `which bundle || gem install bundler`
M
Mislav Marohnić 已提交
388 389 390 391
1. Install development dependencies:  
    `bundle install`
2. Verify that existing tests pass:  
    `bundle exec rake`
M
Mislav Marohnić 已提交
392
3. Create a topic branch:  
M
Mislav Marohnić 已提交
393 394
    `git checkout -b feature`
4. **Make your changes.** (It helps a lot if you write tests first.)
M
Mislav Marohnić 已提交
395
5. Verify that tests still pass:  
M
Mislav Marohnić 已提交
396
    `bundle exec rake`
M
Mislav Marohnić 已提交
397 398 399
6. Fork hub on GitHub (adds a remote named "YOUR_USER"):  
    `git fork`
7. Push to your fork:  
M
Mislav Marohnić 已提交
400
    `git push -u YOUR_USER feature`
M
Mislav Marohnić 已提交
401 402 403
8. Open a pull request describing your changes:  
    `git pull-request`

C
Chris Wanstrath 已提交
404

C
Chris Wanstrath 已提交
405 406
Meta
----
C
readme  
Chris Wanstrath 已提交
407

M
Mislav Marohnić 已提交
408 409 410
* Home: <https://github.com/defunkt/hub>
* Bugs: <https://github.com/defunkt/hub/issues>
* Gem: <https://rubygems.org/gems/hub>
M
Mislav Marohnić 已提交
411 412 413
* Authors: <https://github.com/defunkt/hub/contributors>

### Prior art
C
Chris Wanstrath 已提交
414

M
Mislav Marohnić 已提交
415 416
These projects also aim to either improve git or make interacting with
GitHub simpler:
C
Chris Wanstrath 已提交
417

M
Mislav Marohnić 已提交
418 419
* [eg](http://www.gnome.org/~newren/eg/)
* [github-gem](https://github.com/defunkt/github-gem)
C
Chris Wanstrath 已提交
420 421


422
[speed]: http://gist.github.com/284823
C
Chris Wanstrath 已提交
423
[gc]: https://twitter.com/brynary/status/49560668994674688