Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 271 lines (235 sloc) 9.717 kb
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
1 #
2 # git-flow -- A collection of Git extensions to provide high-level
3 # repository operations for Vincent Driessen's branching model.
4 #
5 # Original blog post presenting this model is found at:
6 # http://nvie.com/archives/323
7 #
8 # Feel free to contribute to this project at:
9 # http://github.com/nvie/gitflow
10 #
d72acba @nvie Added inline license terms to all source files.
authored
11 # Copyright 2010 Vincent Driessen. All rights reserved.
12 #
13 # Redistribution and use in source and binary forms, with or without
14 # modification, are permitted provided that the following conditions are met:
15 #
16 # 1. Redistributions of source code must retain the above copyright notice,
17 # this list of conditions and the following disclaimer.
18 #
19 # 2. Redistributions in binary form must reproduce the above copyright
20 # notice, this list of conditions and the following disclaimer in the
21 # documentation and/or other materials provided with the distribution.
22 #
23 # THIS SOFTWARE IS PROVIDED BY VINCENT DRIESSEN ``AS IS'' AND ANY EXPRESS OR
24 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
26 # EVENT SHALL VINCENT DRIESSEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
30 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
32 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #
34 # The views and conclusions contained in the software and documentation are
35 # those of the authors and should not be interpreted as representing official
36 # policies, either expressed or implied, of Vincent Driessen.
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
37 #
38
39 usage() {
a2e4116 @nvie Document all available flags in all of the subcommand synopsis texts.
authored
40 echo "usage: git flow init [-f]"
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
41 }
42
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
43 parse_args() {
44 # parse options
45 FLAGS "$@" || exit $?
46 eval set -- "${FLAGS_ARGV}"
47 }
48
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
49 # Default entry when no SUBACTION is given
50 cmd_default() {
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
51 DEFINE_boolean force false 'force setting of gitflow branches, even if already configured' f
52 parse_args "$@"
53
283b0f7 @nvie Fixed a problem with redirection of stdout/stderr. The specifier '2>&1'
authored
54 if ! git rev-parse --git-dir >/dev/null 2>&1; then
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
55 git init
56 else
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
57 # assure that we are not working in a repo with local changes
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
58 git_repo_is_headless || require_clean_working_tree
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
59 fi
60
61 # running git flow init on an already initialized repo is fine
62 if gitflow_is_initialized && ! flag force; then
63 warn "Already initialized for gitflow."
64 warn "To force reinitialization, use: git flow init -f"
65 exit 0
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
66 fi
67
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
68 local branch_count
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
69 local answer
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
70
71 # add a master branch if no such branch exists yet
72 local master_branch
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
73 if gitflow_has_master_configured && ! flag force; then
74 master_branch=$(git config --get gitflow.branch.master)
75 else
76 # Two cases are distinguished:
77 # 1. A fresh git repo (without any branches)
78 # We will create a new master/develop branch for the user
79 # 2. Some branches do already exist
80 # We will disallow creation of new master/develop branches and
81 # rather allow to use existing branches for git-flow.
82 local default_suggestion
83 local should_check_existence
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
84 branch_count=$(git_local_branches | wc -l)
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
85 if [ "$branch_count" -eq 0 ]; then
86 echo "No branches exist yet. Base branches must be created now."
87 should_check_existence=NO
b1033aa @nvie gitflow-init honors global gitflow configuration that may exist before a
authored
88 default_suggestion=$(git config --get gitflow.branch.master || echo master)
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
89 else
90 echo
91 echo "Which branch should be used for bringing forth production releases?"
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
92 git_local_branches | sed 's/^.*$/ - &/g'
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
93
94 should_check_existence=YES
95 default_suggestion=
b1033aa @nvie gitflow-init honors global gitflow configuration that may exist before a
authored
96 for guess in $(git config --get gitflow.branch.master) \
97 'production' 'main' 'master'; do
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
98 if git_local_branch_exists "$guess"; then
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
99 default_suggestion="$guess"
100 break
101 fi
102 done
103 fi
104
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
105 printf "Branch name for production releases: [$default_suggestion] "
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
106 read answer
107 master_branch=${answer:-$default_suggestion}
108
109 # check existence in case of an already existing repo
110 if [ "$should_check_existence" = "YES" ]; then
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
111 git_local_branch_exists "$master_branch" || \
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
112 die "Local branch '$master_branch' does not exist."
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
113 fi
6188206 @nvie Always set the gitflow.branch.master and gitflow.branch.develop properti...
authored
114
115 # store the name of the master branch
116 git config gitflow.branch.master "$master_branch"
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
117 fi
118
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
119 # add a develop branch if no such branch exists yet
120 local develop_branch
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
121 if gitflow_has_develop_configured && ! flag force; then
122 develop_branch=$(git config --get gitflow.branch.develop)
123 else
124 # Again, the same two cases as with the master selection are
125 # considered (fresh repo or repo that contains branches)
126 local default_suggestion
127 local should_check_existence
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
128 branch_count=$(git_local_branches | grep -v "^${master_branch}\$" | wc -l)
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
129 if [ "$branch_count" -eq 0 ]; then
130 should_check_existence=NO
b1033aa @nvie gitflow-init honors global gitflow configuration that may exist before a
authored
131 default_suggestion=$(git config --get gitflow.branch.develop || echo develop)
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
132 else
133 echo
134 echo "Which branch should be used for integration of the \"next release\"?"
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
135 git_local_branches | grep -v "^${master_branch}\$" | sed 's/^.*$/ - &/g'
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
136
137 should_check_existence=YES
138 default_suggestion=
b1033aa @nvie gitflow-init honors global gitflow configuration that may exist before a
authored
139 for guess in $(git config --get gitflow.branch.develop) \
140 'develop' 'int' 'integration' 'master'; do
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
141 if git_local_branch_exists "$guess"; then
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
142 default_suggestion="$guess"
143 break
144 fi
145 done
146 fi
147
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
148 printf "Branch name for \"next release\" development: [$default_suggestion] "
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
149 read answer
150 develop_branch=${answer:-$default_suggestion}
151
152 if [ "$master_branch" = "$develop_branch" ]; then
153 die "Production and integration branches should differ."
154 fi
155
156 # check existence in case of an already existing repo
157 if [ "$should_check_existence" = "YES" ]; then
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
158 git_local_branch_exists "$develop_branch" || \
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
159 die "Local branch '$develop_branch' does not exist."
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
160 fi
6188206 @nvie Always set the gitflow.branch.master and gitflow.branch.develop properti...
authored
161
162 # store the name of the develop branch
163 git config gitflow.branch.develop "$develop_branch"
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
164 fi
165
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
166 # Creation of HEAD
167 # ----------------
168 # We create a HEAD now, if it does not exist yet (in a fresh repo). We need
169 # it to be able to create new branches.
3227d80 @nvie Only switch to develop branch if it's newly created.
authored
170 local created_gitflow_branch=0
0161de5 @nvie Added implementation of git-flow-init that asks the user interactively w...
authored
171 if ! git rev-parse --quiet --verify HEAD >/dev/null 2>&1; then
172 git symbolic-ref HEAD "refs/heads/$master_branch"
6188206 @nvie Always set the gitflow.branch.master and gitflow.branch.develop properti...
authored
173 git commit --allow-empty --quiet -m "Initial commit"
3227d80 @nvie Only switch to develop branch if it's newly created.
authored
174 created_gitflow_branch=1
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
175 fi
176
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
177 # Creation of master
178 # ------------------
179 # At this point, there always is a master branch: either it existed already
180 # (and was picked interactively as the production branch) or it has just
181 # been created in a fresh repo
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
182
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
183 # Creation of develop
184 # -------------------
185 # The develop branch possibly does not exist yet. This is the case when,
186 # in a git init'ed repo with one or more commits, master was picked as the
187 # default production branch and develop was "created". We should create
188 # the develop branch now in that case (we base it on master, of course)
7832d6e @nvie Better naming of common functions categorizing them into common,
authored
189 if ! git_local_branch_exists "$develop_branch"; then
3176f74 @nvie Explicitly avoid setting up tracking between develop and master.
authored
190 git branch --no-track "$develop_branch" "$master_branch"
3227d80 @nvie Only switch to develop branch if it's newly created.
authored
191 created_gitflow_branch=1
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
192 fi
193
131c298 @nvie Provided a better way of checking whether master/develop branches need
authored
194 # assert the gitflow repo has been correctly initialized
195 gitflow_is_initialized
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
196
3227d80 @nvie Only switch to develop branch if it's newly created.
authored
197 # switch to develop branch if its newly created
198 if [ $created_gitflow_branch -eq 1 ]; then
199 git checkout -q "$develop_branch"
200 fi
6188206 @nvie Always set the gitflow.branch.master and gitflow.branch.develop properti...
authored
201
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
202 # finally, ask the user for naming conventions (branch and tag prefixes)
b1033aa @nvie gitflow-init honors global gitflow configuration that may exist before a
authored
203 if flag force || \
204 ! git config --get gitflow.prefix.feature >/dev/null 2>&1 ||
205 ! git config --get gitflow.prefix.release >/dev/null 2>&1 ||
206 ! git config --get gitflow.prefix.hotfix >/dev/null 2>&1 ||
207 ! git config --get gitflow.prefix.support >/dev/null 2>&1 ||
208 ! git config --get gitflow.prefix.versiontag >/dev/null 2>&1; then
209 echo
210 echo "How to name your supporting branch prefixes?"
211 fi
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
212
213 local prefix
214
215 # Feature branches
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
216 if ! git config --get gitflow.prefix.feature >/dev/null 2>&1 || flag force; then
217 default_suggestion=$(git config --get gitflow.prefix.feature || echo feature/)
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
218 printf "Feature branches? [$default_suggestion] "
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
219 read answer
220 [ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
221 git config gitflow.prefix.feature "$prefix"
222 fi
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
223
224 # Release branches
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
225 if ! git config --get gitflow.prefix.release >/dev/null 2>&1 || flag force; then
226 default_suggestion=$(git config --get gitflow.prefix.release || echo release/)
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
227 printf "Release branches? [$default_suggestion] "
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
228 read answer
229 [ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
230 git config gitflow.prefix.release "$prefix"
231 fi
232
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
233
234 # Hotfix branches
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
235 if ! git config --get gitflow.prefix.hotfix >/dev/null 2>&1 || flag force; then
236 default_suggestion=$(git config --get gitflow.prefix.hotfix || echo hotfix/)
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
237 printf "Hotfix branches? [$default_suggestion] "
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
238 read answer
239 [ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
240 git config gitflow.prefix.hotfix "$prefix"
241 fi
242
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
243
244 # Support branches
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
245 if ! git config --get gitflow.prefix.support >/dev/null 2>&1 || flag force; then
246 default_suggestion=$(git config --get gitflow.prefix.support || echo support/)
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
247 printf "Support branches? [$default_suggestion] "
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
248 read answer
249 [ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
250 git config gitflow.prefix.support "$prefix"
251 fi
252
f476d26 @nvie While we're user input in git flow init, ask the user for all prefix
authored
253
254 # Version tag prefix
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
255 if ! git config --get gitflow.prefix.versiontag >/dev/null 2>&1 || flag force; then
256 default_suggestion=$(git config --get gitflow.prefix.versiontag || echo "")
f6228ed @nvie Replace \c-terminated echo calls by more portable printf calls.
authored
257 printf "Version tag prefix? [$default_suggestion] "
1d8bb0d @nvie Add function gitflow_has_prefixes_configured(), to check whether a repo ...
authored
258 read answer
259 [ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
260 git config gitflow.prefix.versiontag "$prefix"
261 fi
262
6188206 @nvie Always set the gitflow.branch.master and gitflow.branch.develop properti...
authored
263
264 # TODO: what to do with origin?
186d2b5 @nvie Refactored the subcommand invocation logic to form a more hierarchical s...
authored
265 }
266
b866b01 @nvie Give all subcommands an optional setup() function that will be called by...
authored
267 cmd_help() {
268 usage
269 exit 0
270 }
Something went wrong with that request. Please try again.