git-process-lib 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +123 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +57 -0
- data/LICENSE +193 -0
- data/README.md +342 -0
- data/Rakefile +32 -0
- data/bin/git-new-fb +39 -0
- data/bin/git-pull-request +63 -0
- data/bin/git-sync +38 -0
- data/bin/git-to-master +44 -0
- data/docs/git-new-fb.1.adoc +83 -0
- data/docs/git-process.1.adoc +227 -0
- data/docs/git-pull-request.1.adoc +166 -0
- data/docs/git-sync.1.adoc +120 -0
- data/docs/git-to-master.1.adoc +172 -0
- data/git-new-fb.gemspec +20 -0
- data/git-process-lib.gemspec +25 -0
- data/git-process.gemspec +22 -0
- data/git-pull-request.gemspec +20 -0
- data/git-sync.gemspec +20 -0
- data/git-to-master.gemspec +20 -0
- data/lib/git-process/abstract_error_builder.rb +53 -0
- data/lib/git-process/changed_file_helper.rb +115 -0
- data/lib/git-process/git_abstract_merge_error_builder.rb +130 -0
- data/lib/git-process/git_branch.rb +105 -0
- data/lib/git-process/git_branches.rb +81 -0
- data/lib/git-process/git_config.rb +135 -0
- data/lib/git-process/git_lib.rb +646 -0
- data/lib/git-process/git_logger.rb +84 -0
- data/lib/git-process/git_merge_error.rb +28 -0
- data/lib/git-process/git_process.rb +159 -0
- data/lib/git-process/git_process_error.rb +18 -0
- data/lib/git-process/git_process_options.rb +101 -0
- data/lib/git-process/git_rebase_error.rb +30 -0
- data/lib/git-process/git_remote.rb +222 -0
- data/lib/git-process/git_status.rb +108 -0
- data/lib/git-process/github_configuration.rb +298 -0
- data/lib/git-process/github_pull_request.rb +165 -0
- data/lib/git-process/new_fb.rb +49 -0
- data/lib/git-process/parked_changes_error.rb +41 -0
- data/lib/git-process/pull_request.rb +136 -0
- data/lib/git-process/pull_request_error.rb +25 -0
- data/lib/git-process/rebase_to_master.rb +148 -0
- data/lib/git-process/sync_process.rb +55 -0
- data/lib/git-process/syncer.rb +157 -0
- data/lib/git-process/uncommitted_changes_error.rb +23 -0
- data/lib/git-process/version.rb +22 -0
- data/local-build.rb +24 -0
- data/spec/FileHelpers.rb +19 -0
- data/spec/GitRepoHelper.rb +123 -0
- data/spec/changed_file_helper_spec.rb +127 -0
- data/spec/git_abstract_merge_error_builder_spec.rb +64 -0
- data/spec/git_branch_spec.rb +123 -0
- data/spec/git_config_spec.rb +45 -0
- data/spec/git_lib_spec.rb +176 -0
- data/spec/git_logger_spec.rb +66 -0
- data/spec/git_process_spec.rb +208 -0
- data/spec/git_remote_spec.rb +227 -0
- data/spec/git_status_spec.rb +122 -0
- data/spec/github_configuration_spec.rb +152 -0
- data/spec/github_pull_request_spec.rb +117 -0
- data/spec/github_test_helper.rb +49 -0
- data/spec/new_fb_spec.rb +126 -0
- data/spec/pull_request_helper.rb +94 -0
- data/spec/pull_request_spec.rb +137 -0
- data/spec/rebase_to_master_spec.rb +362 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/sync_spec.rb +1474 -0
- metadata +249 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
GIT-PULL-REQUEST(1)
|
2
|
+
===================
|
3
|
+
:doctype: manpage
|
4
|
+
|
5
|
+
|
6
|
+
NAME
|
7
|
+
----
|
8
|
+
git-pull-request - Creates or gets a GitHub pull request.
|
9
|
+
|
10
|
+
|
11
|
+
SYNOPSIS
|
12
|
+
--------
|
13
|
+
'git-pull-request' ['OPTIONS']
|
14
|
+
|
15
|
+
'git-pull-request' ['OPTIONS'] 'pull_request_title'
|
16
|
+
|
17
|
+
'git-pull-request' ['OPTIONS'] [ 'server/pull_request_number' | 'pull_request_number' ]
|
18
|
+
|
19
|
+
|
20
|
+
DESCRIPTION
|
21
|
+
-----------
|
22
|
+
'git-pull-request(1)' creates or gets a pull request on the GitHub
|
23
|
+
server associated with the current branch. For the reasons why pull
|
24
|
+
requests are useful for the development process,
|
25
|
+
see <https://help.github.com/articles/using-pull-requests>
|
26
|
+
|
27
|
+
The 'git-pull-request(1)' command is a nice, simplified alternative to using the
|
28
|
+
web interface that takes advantage of the conventions used in the rest of the
|
29
|
+
'git-process(1)' suite.
|
30
|
+
|
31
|
+
If no name or number is provided, it is assumed that you want to create a new
|
32
|
+
pull request with the same name as the current branch. If a name is explicitly
|
33
|
+
given, that is used instead.
|
34
|
+
|
35
|
+
If a number is given, or a number with a server preceding it (e.g., "origin/23"),
|
36
|
+
then this assumes that the number refers to an existing pull request identified
|
37
|
+
by that number. In that case, the branch associated with the HEAD of the pull
|
38
|
+
request is checked out.
|
39
|
+
|
40
|
+
The URL for the newly created pull request is shown, making it trivial to make
|
41
|
+
any changes you want to it, such as adding additional notes. (Most terminal
|
42
|
+
programs allow you to "click through" a URL, though they all differ slightly
|
43
|
+
in how. For example, iTerm2 on OS X does it with a Cmd-Click.)
|
44
|
+
|
45
|
+
The counterpart to this command is 'git-to-master(1)'.
|
46
|
+
|
47
|
+
It's assumed that you *never* do any work directly on the integration branch:
|
48
|
+
everything is done on a feature branch. In addition to being a much
|
49
|
+
safer and more flexible way of working in general, it is also a
|
50
|
+
requirement to take advantage of same-repo pull request functionality.
|
51
|
+
|
52
|
+
|
53
|
+
OPTIONS
|
54
|
+
-------
|
55
|
+
|
56
|
+
The effective default is "*git pull-request -r -i -f*".
|
57
|
+
|
58
|
+
*-b <branch>, --base-branch <branch>*::
|
59
|
+
The branch on the server that you want this "pulled" into. See the
|
60
|
+
'gitProcess.integrationBranch' configuration item. (*default: the integration branch*)
|
61
|
+
|
62
|
+
*-e <branch>, --head-branch <branch>*::
|
63
|
+
The branch that you want reviewed before being "pulled" into the
|
64
|
+
base branch. (*default: the current branch*)
|
65
|
+
|
66
|
+
*-r <repo>, --repo-name <repo>*::
|
67
|
+
The name of the repository to "pull" into. See the 'gitProcess.remoteName'
|
68
|
+
configuration item. (*default: the current repository)
|
69
|
+
|
70
|
+
*-d <desc>, --description <desc>*::
|
71
|
+
The description of the Pull Request. Usually includes a nice description of what was
|
72
|
+
changed to make things easier for the reviewer.
|
73
|
+
|
74
|
+
*-u <username>, --user <username>*::
|
75
|
+
Your GitHub username. Only needed the first time you connect, and you will be
|
76
|
+
prompted for it if needed. Used to generate the value for the 'gitProcess.github.authtoken'
|
77
|
+
configuration. See also the 'github.user' configuration item.
|
78
|
+
|
79
|
+
*-p <password>, --password <password>*::
|
80
|
+
Your GitHub password. Only needed the first time you connect, and you will be
|
81
|
+
prompted for it if needed. Used to generate the value for the 'gitProcess.github.authtoken'
|
82
|
+
configuration.
|
83
|
+
|
84
|
+
*--info*::
|
85
|
+
Informational messages; show the major things this is doing (*default: true*)
|
86
|
+
|
87
|
+
*-q, --quiet*::
|
88
|
+
Quiet messages; only show errors
|
89
|
+
|
90
|
+
*-v, --verbose*::
|
91
|
+
Verbose messages; show lots of details on what this is doing
|
92
|
+
|
93
|
+
*--version*::
|
94
|
+
Print version and exit
|
95
|
+
|
96
|
+
|
97
|
+
CONFIGURATION
|
98
|
+
-------------
|
99
|
+
|
100
|
+
Options for 'git-sync(1)' are set using 'git-config(1)'.
|
101
|
+
|
102
|
+
*gitProcess.remoteName*::
|
103
|
+
Allows you to explicitly set the remote server name to use. Defaults
|
104
|
+
to the first server name reported by 'git-remote(1)'.
|
105
|
+
|
106
|
+
*gitProcess.integrationBranch*::
|
107
|
+
Allows you to explicitly set the integration branch to use. Defaults
|
108
|
+
to "master".
|
109
|
+
|
110
|
+
*gitProcess.github.authtoken*::
|
111
|
+
Not meant to be set manually, this is the OAuth token used to communicate
|
112
|
+
with the GitHub server. If it is not set, the user will be prompted for their credentials.
|
113
|
+
|
114
|
+
*github.user*::
|
115
|
+
If OAuth needs to prompt for credentials, if this value is set then it is
|
116
|
+
used as the username. Otherwise it is unused.
|
117
|
+
|
118
|
+
|
119
|
+
GITHUB SUPPORT
|
120
|
+
--------------
|
121
|
+
|
122
|
+
To know which GitHub URL to use, the value of 'gitProcess.remoteName' is resolved
|
123
|
+
to the underlying server name/IP. (That includes
|
124
|
+
"aliased" names in a 'ssh_config(5)' file.) If it's github.com, then the public
|
125
|
+
GitHub.com API is used. Otherwise it's assumed that the server is GitHub Enterprise
|
126
|
+
and that set of URLs is used.
|
127
|
+
|
128
|
+
|
129
|
+
EXAMPLE
|
130
|
+
-------
|
131
|
+
|
132
|
+
You've been developing your killer new feature or bug fix, and you want
|
133
|
+
someone else to look at it (to do code-review or otherwise provide input).
|
134
|
+
'git-pull-request(1)' synchronizes the current branch with
|
135
|
+
the server (effectively executing 'git-sync(1)') and creates the pull request
|
136
|
+
against the integration branch.
|
137
|
+
|
138
|
+
|
139
|
+
CONTROL FILES
|
140
|
+
-------------
|
141
|
+
|
142
|
+
*gitprocess-sync-\***--**::
|
143
|
+
To help make the process simpler and more reliable, 'git-pull-request(1)' will put a file in the "'.git'" directory
|
144
|
+
that contains the SHA-1 of the last successful sync to the server. 'git-to-master(1)' will remove the file
|
145
|
+
as part of its normal "housekeeping."
|
146
|
+
|
147
|
+
|
148
|
+
SEE ALSO
|
149
|
+
--------
|
150
|
+
|
151
|
+
*git-process*(1), *git-to-master*(1), *git-new-fb*(1), *git-sync*(1)
|
152
|
+
|
153
|
+
|
154
|
+
BUGS
|
155
|
+
----
|
156
|
+
Known bug list: <https://github.com/jdigger/git-process/issues?state=open>
|
157
|
+
|
158
|
+
|
159
|
+
AUTHOR
|
160
|
+
------
|
161
|
+
git-sync has been written primarily by Jim Moore.
|
162
|
+
|
163
|
+
|
164
|
+
RESOURCES
|
165
|
+
---------
|
166
|
+
Main web site: <https://github.com/jdigger/git-process>
|
@@ -0,0 +1,120 @@
|
|
1
|
+
GIT-SYNC(1)
|
2
|
+
===========
|
3
|
+
:doctype: manpage
|
4
|
+
|
5
|
+
|
6
|
+
NAME
|
7
|
+
----
|
8
|
+
git-sync - Syncs local changes with the server.
|
9
|
+
|
10
|
+
|
11
|
+
SYNOPSIS
|
12
|
+
--------
|
13
|
+
'git-sync' ['OPTIONS'] [ 'branchname' ]
|
14
|
+
|
15
|
+
|
16
|
+
DESCRIPTION
|
17
|
+
-----------
|
18
|
+
'git-sync(1)' fetches the latest repository from the server, rebases/merges
|
19
|
+
the current branch against the changes in the integration branch, then pushes
|
20
|
+
the result up to a branch on the server of the same name. (Unless told not to.)
|
21
|
+
|
22
|
+
If a branch name is given, it is assumed that it is a remote branch that you want
|
23
|
+
to start doing work on with full 'git-sync(1)' support. The branch will be fetched
|
24
|
+
from the server, checked out, and a control file created.
|
25
|
+
|
26
|
+
There is a lot of logic to make sure that rebasing/merging happens safely and
|
27
|
+
with minimal conflicts regardless of things like squashes, multiple people working
|
28
|
+
on the same feature branch, etc.
|
29
|
+
|
30
|
+
|
31
|
+
OPTIONS
|
32
|
+
-------
|
33
|
+
|
34
|
+
The effective default is "*git sync -r -i -f*".
|
35
|
+
|
36
|
+
*-r, --rebase*::
|
37
|
+
Rebase instead of merge against the integration branch (*default: true*)
|
38
|
+
|
39
|
+
*--merge*::
|
40
|
+
Merge instead of rebase against the integration branch
|
41
|
+
|
42
|
+
*-f, --force*::
|
43
|
+
Force the push; defaults to *true* if *--rebase* is used
|
44
|
+
|
45
|
+
*-l, --local*::
|
46
|
+
Do not do a push; gets remote changes, but does not update the server
|
47
|
+
|
48
|
+
*--info*::
|
49
|
+
Informational messages; show the major things this is doing (*default: true*)
|
50
|
+
|
51
|
+
*-q, --quiet*::
|
52
|
+
Quiet messages; only show errors
|
53
|
+
|
54
|
+
*-v, --verbose*::
|
55
|
+
Verbose messages; show lots of details on what this is doing
|
56
|
+
|
57
|
+
*--version*::
|
58
|
+
Print version and exit
|
59
|
+
|
60
|
+
|
61
|
+
CONFIGURATION
|
62
|
+
-------------
|
63
|
+
|
64
|
+
Options for 'git-sync(1)' are set using 'git-config(1)'.
|
65
|
+
|
66
|
+
*gitProcess.remoteName*::
|
67
|
+
Allows you to explicitly set the remote server name to use. Defaults
|
68
|
+
to the first server name reported by 'git-remote(1)'.
|
69
|
+
|
70
|
+
*gitProcess.integrationBranch*::
|
71
|
+
Allows you to explicitly set the integration branch to use. Defaults
|
72
|
+
to "master".
|
73
|
+
|
74
|
+
*gitProcess.defaultRebaseSync*::
|
75
|
+
Should 'git-sync(1)' use *--rebase* by default instead of *--merge*? Defaults to *true*.
|
76
|
+
|
77
|
+
|
78
|
+
EXAMPLE
|
79
|
+
-------
|
80
|
+
|
81
|
+
Assuming that the current branch is called "interesting_changes" and the integration
|
82
|
+
branch on the server is "master", typing "git sync" will do roughly the following
|
83
|
+
for you:
|
84
|
+
|
85
|
+
$ git fetch -p
|
86
|
+
# if there have been changes on the remote fb since the last sync
|
87
|
+
$ git rebase origin/interesting_changes
|
88
|
+
$ git rebase origin/master
|
89
|
+
# verify nothing has changed in the window of time since the last check
|
90
|
+
$ git push origin +interesting_changes:interesting_changes
|
91
|
+
|
92
|
+
|
93
|
+
CONTROL FILES
|
94
|
+
-------------
|
95
|
+
|
96
|
+
*gitprocess-sync-\***--**::
|
97
|
+
To help make the process simpler and more reliable, 'git-sync(1)' will put a file in the "'.git'" directory
|
98
|
+
that contains the SHA-1 of the last successful sync to the server. 'git-to-master(1)' will remove the file
|
99
|
+
as part of its normal "housekeeping."
|
100
|
+
|
101
|
+
|
102
|
+
SEE ALSO
|
103
|
+
--------
|
104
|
+
|
105
|
+
*git-process*(1), *git-to-master*(1), *git-new-fb*(1), *git-pull-request*(1)
|
106
|
+
|
107
|
+
|
108
|
+
BUGS
|
109
|
+
----
|
110
|
+
Known bug list: <https://github.com/jdigger/git-process/issues?state=open>
|
111
|
+
|
112
|
+
|
113
|
+
AUTHOR
|
114
|
+
------
|
115
|
+
git-sync has been written primarily by Jim Moore.
|
116
|
+
|
117
|
+
|
118
|
+
RESOURCES
|
119
|
+
---------
|
120
|
+
Main web site: <https://github.com/jdigger/git-process>
|
@@ -0,0 +1,172 @@
|
|
1
|
+
GIT-TO-MASTER(1)
|
2
|
+
================
|
3
|
+
:doctype: manpage
|
4
|
+
|
5
|
+
|
6
|
+
NAME
|
7
|
+
----
|
8
|
+
git-to-master - Rebase against the integration branch, then pushes to it.
|
9
|
+
|
10
|
+
|
11
|
+
SYNOPSIS
|
12
|
+
--------
|
13
|
+
'git-to-master' ['OPTIONS'] ['server/pull_request_number' | 'pull_request_number']
|
14
|
+
|
15
|
+
|
16
|
+
DESCRIPTION
|
17
|
+
-----------
|
18
|
+
|
19
|
+
'git-to-master(1)' fetches the latest changes from the server, rebases against
|
20
|
+
the integration branch, pushes to the integration branch, then does
|
21
|
+
housecleaning.
|
22
|
+
|
23
|
+
If there is a problem, such as a merge conflict, this tries to
|
24
|
+
resolve it automatically. If it can not do so safely in an automated way,
|
25
|
+
if tells you the steps involved for doing so manually.
|
26
|
+
|
27
|
+
"Housecleaning" includes such things as closing any
|
28
|
+
Pull Request that may exist for the branch, removing the (now obsolete)
|
29
|
+
local and remote feature branches, and then "parking" on the
|
30
|
+
special "'_parking_'" branch.
|
31
|
+
|
32
|
+
Work is not expected to be done on the "'_parking_'" branch, but any that is
|
33
|
+
done is brought over to a newly created feature branch when you do
|
34
|
+
'git-new-fb(1)'.
|
35
|
+
|
36
|
+
It's assumed that you *never* do any work directly on the integration branch:
|
37
|
+
everything is done on a feature branch. In addition to being a much
|
38
|
+
safer and more flexible way of working in general, it is also a
|
39
|
+
requirement to take advantage of pull request functionality. (See
|
40
|
+
'git-pull-request(1)'.)
|
41
|
+
|
42
|
+
If a number is given, or a number with a server preceding it (e.g.,
|
43
|
+
"origin/23"), then this assumes that the number refers to an existing pull
|
44
|
+
request identified by that number. In that case, the branch associated with
|
45
|
+
the HEAD of the pull request is checked out before doing the rest of the
|
46
|
+
"to-master".
|
47
|
+
|
48
|
+
|
49
|
+
EXAMPLE WITHOUT PULL REQUEST
|
50
|
+
----------------------------
|
51
|
+
|
52
|
+
Assuming that the current branch is called "interesting_changes" and the
|
53
|
+
integration branch on the server is "master", typing "*git to-master*" will do
|
54
|
+
roughly the following for you:
|
55
|
+
|
56
|
+
$ git fetch -p
|
57
|
+
$ git rebase origin/master
|
58
|
+
$ git push origin interesting_changes:master
|
59
|
+
# close pull request if one exists
|
60
|
+
$ git checkout -b _parking_ origin/master
|
61
|
+
$ git branch -d interesting_changes
|
62
|
+
$ git push origin --delete interesting_changes
|
63
|
+
|
64
|
+
If you use the --keep option, then the process stops after the first "push".
|
65
|
+
|
66
|
+
|
67
|
+
EXAMPLE WITH PULL REQUEST
|
68
|
+
-------------------------
|
69
|
+
|
70
|
+
Assuming that the pull request number is 493, its branch name is "interesting_changes"
|
71
|
+
and the integration branch on the server is "master", typing "*git to-master 493*" will
|
72
|
+
do roughly the following for you:
|
73
|
+
|
74
|
+
$ git fetch -p
|
75
|
+
# looks up the information for pull-request 493
|
76
|
+
$ git checkout -b interesting_changes origin/interesting_changes
|
77
|
+
$ git rebase origin/master
|
78
|
+
$ git push origin interesting_changes:master
|
79
|
+
# close pull request
|
80
|
+
$ git checkout -b _parking_ origin/master
|
81
|
+
$ git branch -d interesting_changes
|
82
|
+
$ git push origin --delete interesting_changes
|
83
|
+
|
84
|
+
If you would like the review the changes locally first, use 'git-pull-request(1)'
|
85
|
+
instead.
|
86
|
+
|
87
|
+
|
88
|
+
OPTIONS
|
89
|
+
-------
|
90
|
+
|
91
|
+
The effective default is "*git to-master --info*".
|
92
|
+
|
93
|
+
*-k, --keep*::
|
94
|
+
Don't do any "cleanup." It keeps the current local and remote branches, and does
|
95
|
+
not close any outstanding pull requests.
|
96
|
+
|
97
|
+
*--info*::
|
98
|
+
Informational messages; show the major things this is doing (*default: true*)
|
99
|
+
|
100
|
+
*-q, --quiet*::
|
101
|
+
Quiet messages; only show errors
|
102
|
+
|
103
|
+
*-v, --verbose*::
|
104
|
+
Verbose messages; show lots of details on what this is doing
|
105
|
+
|
106
|
+
*--version*::
|
107
|
+
Print version and exit
|
108
|
+
|
109
|
+
|
110
|
+
CONFIGURATION
|
111
|
+
-------------
|
112
|
+
|
113
|
+
Options for 'git-to-master(1)' are set using 'git-config(1)'.
|
114
|
+
|
115
|
+
*gitProcess.remoteName*::
|
116
|
+
Allows you to explicitly set the remote server name to use. Defaults
|
117
|
+
to the first server name reported by 'git-remote(1)' (which is
|
118
|
+
typically "origin" since most projects have a single remote).
|
119
|
+
|
120
|
+
*gitProcess.integrationBranch*::
|
121
|
+
Allows you to explicitly set the integration branch to use. Defaults
|
122
|
+
to "master".
|
123
|
+
|
124
|
+
*gitProcess.github.authtoken*::
|
125
|
+
Not meant to be set manually, this is the OAuth token used to communicate
|
126
|
+
with the GitHub server. If it is not set, the user will be prompted for their credentials.
|
127
|
+
|
128
|
+
*github.user*::
|
129
|
+
If OAuth needs to prompt for credentials, if this value is set then it is
|
130
|
+
used as the username. Otherwise it is unused.
|
131
|
+
|
132
|
+
|
133
|
+
CONTROL FILES
|
134
|
+
-------------
|
135
|
+
|
136
|
+
*gitprocess-sync-\***--**::
|
137
|
+
To help make the process simpler and more reliable, 'git-to-master(1)' will
|
138
|
+
read a file in the "'.git'" directory that contains the SHA-1 of the last
|
139
|
+
successful sync to the server. (See 'git-sync(1)'.) As part of its normal
|
140
|
+
"housekeeping" 'git-to-master(1)' will remove the file if *--keep* is not
|
141
|
+
specified.
|
142
|
+
|
143
|
+
|
144
|
+
GITHUB SUPPORT
|
145
|
+
--------------
|
146
|
+
|
147
|
+
To know which GitHub URL to use for pull-request support, the value of
|
148
|
+
'gitProcess.remoteName' is resolved to the underlying server name/IP. (That includes
|
149
|
+
"aliased" names in a 'ssh_config(5)' file.) If it's github.com, then the public
|
150
|
+
GitHub.com API is used. Otherwise it's assumed that the server is GitHub Enterprise
|
151
|
+
and that set of URLs is used.
|
152
|
+
|
153
|
+
|
154
|
+
SEE ALSO
|
155
|
+
--------
|
156
|
+
|
157
|
+
*git-process*(1), *git-sync*(1), *git-new-fb*(1), *git-pull-request*(1)
|
158
|
+
|
159
|
+
|
160
|
+
BUGS
|
161
|
+
----
|
162
|
+
Known bug list: <https://github.com/jdigger/git-process/issues?state=open>
|
163
|
+
|
164
|
+
|
165
|
+
AUTHOR
|
166
|
+
------
|
167
|
+
git-to-master has been written primarily by Jim Moore.
|
168
|
+
|
169
|
+
|
170
|
+
RESOURCES
|
171
|
+
---------
|
172
|
+
Main web site: <https://github.com/jdigger/git-process>
|