git-scripts 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/bin/feature +28 -14
  3. data/bin/hotfix +24 -19
  4. data/lib/git.rb +11 -11
  5. data/lib/github.rb +36 -8
  6. data/lib/helpers.rb +2 -2
  7. data/man/feature-clean.1 +1 -1
  8. data/man/feature-clean.1.html +120 -0
  9. data/man/feature-clean.1.markdown +61 -0
  10. data/man/feature-finish-issue.1 +1 -1
  11. data/man/feature-finish-issue.1.html +113 -0
  12. data/man/feature-finish-issue.1.markdown +56 -0
  13. data/man/feature-finish.1 +1 -1
  14. data/man/feature-finish.1.html +9 -3
  15. data/man/feature-finish.1.markdown +56 -0
  16. data/man/feature-github-test.1 +1 -1
  17. data/man/{feature-url.1.html → feature-github-test.1.html} +15 -9
  18. data/man/feature-github-test.1.markdown +53 -0
  19. data/man/feature-list.1 +1 -1
  20. data/man/feature-list.1.html +8 -2
  21. data/man/feature-list.1.markdown +60 -0
  22. data/man/feature-merge.1 +2 -2
  23. data/man/feature-merge.1.html +7 -1
  24. data/man/feature-merge.1.markdown +59 -0
  25. data/man/feature-merge.1.ronn +1 -0
  26. data/man/feature-prune.1 +1 -1
  27. data/man/feature-prune.1.html +116 -0
  28. data/man/feature-prune.1.markdown +60 -0
  29. data/man/feature-start.1 +1 -1
  30. data/man/feature-start.1.html +110 -0
  31. data/man/feature-start.1.markdown +53 -0
  32. data/man/feature-stashes.1 +1 -1
  33. data/man/feature-stashes.1.html +122 -0
  34. data/man/feature-stashes.1.markdown +63 -0
  35. data/man/feature-status.1 +1 -1
  36. data/man/feature-status.1.html +113 -0
  37. data/man/feature-status.1.markdown +56 -0
  38. data/man/feature-switch.1 +1 -1
  39. data/man/feature-switch.1.html +8 -2
  40. data/man/feature-switch.1.markdown +61 -0
  41. data/man/feature.1 +1 -1
  42. data/man/feature.1.html +8 -3
  43. data/man/feature.1.markdown +80 -0
  44. data/man/hotfix-finish-issue.1 +1 -1
  45. data/man/hotfix-finish-issue.1.html +113 -0
  46. data/man/hotfix-finish-issue.1.markdown +56 -0
  47. data/man/hotfix-finish.1 +1 -1
  48. data/man/hotfix-finish.1.html +112 -0
  49. data/man/hotfix-finish.1.markdown +55 -0
  50. data/man/hotfix-list.1 +1 -1
  51. data/man/hotfix-list.1.html +8 -2
  52. data/man/hotfix-list.1.markdown +60 -0
  53. data/man/hotfix-merge.1 +2 -2
  54. data/man/hotfix-merge.1.html +7 -1
  55. data/man/hotfix-merge.1.markdown +59 -0
  56. data/man/hotfix-merge.1.ronn +1 -0
  57. data/man/hotfix-start.1 +1 -1
  58. data/man/{hotfix-url.1.html → hotfix-start.1.html} +15 -9
  59. data/man/hotfix-start.1.markdown +53 -0
  60. data/man/hotfix-switch.1 +1 -1
  61. data/man/hotfix-switch.1.html +112 -0
  62. data/man/hotfix-switch.1.markdown +55 -0
  63. data/man/hotfix.1 +1 -1
  64. data/man/hotfix.1.html +7 -2
  65. data/man/hotfix.1.markdown +68 -0
  66. metadata +84 -64
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9a2d6d6518dbc7ecc8f65e1d05f2d726198bbd74
4
+ data.tar.gz: 676e53c8cc96c98d13745280205c74108d7aa281
5
+ SHA512:
6
+ metadata.gz: 4d8177e27268f8eb876a17936a196364c7bb633c2ded649e4a715fa22fd6a8d8f6895e7dbe8d57122f03bab8d1ff75291bb46744b0ede02568fa1766c80efeab
7
+ data.tar.gz: 05cb8fd81e03130a108f45be0d1802cbc5d1bf2ef5faf2250958f2714a87c69a8f3f8c05838cbef976fc727c6cd2b5d9615394cd99f6ad4ace0bc6b9ade6c5d9
data/bin/feature CHANGED
@@ -26,11 +26,12 @@ when 'start'
26
26
  feature = ARGV[1]
27
27
 
28
28
  exit unless confirm("Create feature branch named: '#{feature}' ?")
29
+ development_branch = Git::get_branch('development')
29
30
 
30
31
  Git::run_safe([
31
- "git checkout #{Git::development_branch}",
32
+ "git checkout #{development_branch}",
32
33
  "git pull --rebase",
33
- "git branch \"#{feature}\" #{Git::development_branch}",
34
+ "git branch \"#{feature}\" #{development_branch}",
34
35
  "git checkout \"#{feature}\"",
35
36
  ])
36
37
 
@@ -96,7 +97,7 @@ when 'finish'
96
97
 
97
98
  response = octokit.create_pull_request(
98
99
  Github::get_github_repo,
99
- Git::development_branch,
100
+ Git::get_branch('development'),
100
101
  feature,
101
102
  description[:title],
102
103
  description[:body]
@@ -118,7 +119,7 @@ when 'finish-issue'
118
119
 
119
120
  pull = octokit.create_pull_request_for_issue(
120
121
  Github::get_github_repo,
121
- Git::development_branch,
122
+ Git::get_branch('development'),
122
123
  feature,
123
124
  issue
124
125
  )
@@ -156,14 +157,25 @@ Original issue: #{original_title}
156
157
  puts " " + updated_pull[:html_url]
157
158
 
158
159
  when 'merge'
159
- dev_branch = Git::development_branch
160
+ dev_branch = Git::get_branch('development')
160
161
  fail_on_local_changes
161
162
 
162
- feature = ARGV[1] || Git::current_branch
163
+ if ARGV[1] == '-n'
164
+ feature = get_branch_name_from_number(ARGV[2])
165
+ else
166
+ feature = ARGV[1] || Git::current_branch
167
+ end
168
+
169
+
170
+ pull_info = Github::get_pull_request_info_from_api(feature, dev_branch)
171
+
172
+ warning = Github::get_commit_status_warning(pull_info[:status])
173
+ unless warning.empty?
174
+ puts highlight(warning)
175
+ end
163
176
 
164
177
  exit 1 unless confirm("Merge feature branch named: '#{feature}' ?")
165
178
 
166
- description = Github::get_pull_request_description_from_api(feature, dev_branch)
167
179
  update = Git::submodules_update("get")
168
180
 
169
181
  Git::run_safe([
@@ -176,7 +188,7 @@ when 'merge'
176
188
  # rebase the unpushed master commits if any.
177
189
  "git rebase --preserve-merges origin/#{dev_branch}",
178
190
  # merge the feature branch into master
179
- "git merge --no-ff --edit -m #{description.shellescape} \"#{feature}\"",
191
+ "git merge --no-ff --edit -m #{pull_info[:description].shellescape} \"#{feature}\"",
180
192
  # init any submodules in the master branch
181
193
  "#{update}",
182
194
  # delete the local feature-branch
@@ -216,12 +228,14 @@ when 'prune'
216
228
  end
217
229
 
218
230
  currentBranch = Git::current_branch()
231
+ development_branch = Git::get_branch('development')
232
+ stable_branch = Git::get_branch('stable')
219
233
 
220
234
  def branches_cmd(location, currentBranch)
221
- branch = location == 'origin' ? 'origin/master' : 'master'
235
+ branch = location == 'origin' ? "origin/#{development_branch}" : development_branch
222
236
  return "git branch --merged #{branch} |
223
- grep -v master |
224
- grep -v stable |
237
+ grep -v #{development_branch} |
238
+ grep -v #{stable_branch} |
225
239
  grep -v #{currentBranch}"
226
240
  end
227
241
 
@@ -245,9 +259,9 @@ when 'prune'
245
259
  system("#{commands} | xargs git branch -d")
246
260
  elsif location == "origin"
247
261
  system("git remote prune origin &&
248
- git branch -r --merged origin/master |
249
- grep -v master |
250
- grep -v stable |
262
+ git branch -r --merged origin/#{development_branch} |
263
+ grep -v #{development_branch} |
264
+ grep -v #{stable_branch} |
251
265
  grep -v #{currentBranch} |
252
266
  sed -n 's| origin/|:|p' |
253
267
  xargs git push origin")
data/bin/hotfix CHANGED
@@ -18,13 +18,14 @@ case command
18
18
  when 'start'
19
19
  require_argument(:hotfix, :start)
20
20
  hotfix = hotfix_branch(ARGV[1])
21
+ stable_branch = Git::get_branch('stable')
21
22
 
22
23
  exit unless confirm("Create hotfix branch named: '#{hotfix}' ?")
23
24
 
24
25
  Git::run_safe([
25
- "git checkout stable",
26
+ "git checkout #{stable_branch}",
26
27
  "git pull --rebase",
27
- "git branch \"#{hotfix}\" stable",
28
+ "git branch \"#{hotfix}\" #{stable_branch}",
28
29
  "git checkout \"#{hotfix}\""
29
30
  ])
30
31
 
@@ -60,7 +61,7 @@ when 'finish'
60
61
 
61
62
  response = octokit.create_pull_request(
62
63
  Github::get_github_repo,
63
- 'stable',
64
+ Git::get_branch('stable'),
64
65
  hotfix,
65
66
  description[:title],
66
67
  description[:body]
@@ -83,7 +84,7 @@ when 'finish-issue'
83
84
 
84
85
  pull = octokit.create_pull_request_for_issue(
85
86
  Github::get_github_repo,
86
- 'stable',
87
+ Git::get_branch('stable'),
87
88
  hotfix,
88
89
  issue
89
90
  )
@@ -122,20 +123,24 @@ Original issue: #{original_title}
122
123
 
123
124
  when 'merge'
124
125
  fail_on_local_changes
125
- dev_branch = Git::development_branch
126
+ dev_branch = Git::get_branch('development')
127
+ stable_branch = Git::get_branch('stable')
126
128
  hotfix = current_hotfix_branch
127
129
 
128
130
  Git::run_safe(["git fetch"])
129
131
 
130
- exit 1 unless confirm("Merge hotfix named: '#{hotfix}' ?")
132
+ pull_info = Github::get_pull_request_info_from_api(hotfix, stable_branch)
133
+
134
+ warning = Github::get_commit_status_warning(pull_info[:status])
135
+ unless warning.empty?
136
+ puts highlight(warning)
137
+ end
131
138
 
132
- description = Github::get_pull_request_description_from_api(hotfix, 'stable')
139
+ exit 1 unless confirm("Merge hotfix named: '#{hotfix}' ?")
133
140
 
134
- commit_message = Git::get_description_from_user(description)
135
- # The first instance of stable should be in the pull request title.
136
- dev_commit_message = commit_message.sub('stable', dev_branch)
141
+ commit_message = Git::get_description_from_user(pull_info[:description])
142
+ commit_message_dev = commit_message.sub(stable_branch, dev_branch)
137
143
 
138
- # Get command to init any submodules in the stable branch.
139
144
  update = Git::submodules_update("get")
140
145
 
141
146
  Git::run_safe([
@@ -143,29 +148,29 @@ when 'merge'
143
148
  "git checkout #{hotfix.shellescape}",
144
149
  "git rebase --preserve-merges origin/#{hotfix.shellescape}",
145
150
  # Merge into stable.
146
- "git checkout stable",
151
+ "git checkout #{stable_branch}",
147
152
  # Pull the latest changes and rebase the unpushed commits if any.
148
- "git rebase --preserve-merges origin/stable",
153
+ "git rebase --preserve-merges origin/#{stable_branch}",
149
154
  # Merge the hotfix branch into stable.
150
- "git merge --no-ff --no-edit -m #{commit_message.shellescape} #{hotfix.shellescape}",
155
+ "git merge --no-ff --no-edit -m #{commit_message.shellescape} \"#{hotfix}\"",
151
156
  "#{update}",
152
157
  # Merge into master.
153
158
  "git checkout #{dev_branch}",
154
159
  # Pull the latest changes and rebase the unpushed master commits if any.
155
160
  "git rebase origin/#{dev_branch}",
156
161
  # Merge the hotfix branch into master.
157
- "git merge --no-ff --no-edit -m #{dev_commit_message.shellescape} #{hotfix.shellescape}",
158
- # Init any submodules in the master branch. Note: no need to change
159
- # directories before calling git submodule since we are already in the
162
+ "git merge --no-ff --no-edit -m #{commit_message_dev.shellescape} \"#{hotfix}\"",
163
+ # Init any submodules in the master branch. Note: no need to change.
164
+ # Directories before calling git submodule since we are already in the
160
165
  # projects top-level directory.
161
166
  "#{update}",
162
167
  # Delete the local hotfix branch.
163
168
  "git branch -d #{hotfix.shellescape}",
164
169
  # Checkout stable branch.
165
- "git checkout stable"
170
+ "git checkout #{stable_branch}"
166
171
  ])
167
172
 
168
- puts "Successfully merged hotfix branch: #{hotfix} into stable and #{dev_branch}"
173
+ puts "Successfully merged hotfix branch: #{hotfix} into #{stable_branch} and #{dev_branch}"
169
174
  puts "If you are satisfied with the result, do this:\n" + <<CMDS
170
175
  git push
171
176
  git checkout #{dev_branch}
data/lib/git.rb CHANGED
@@ -8,15 +8,14 @@ module Git
8
8
  return system("git rev-parse")
9
9
  end
10
10
 
11
- # Return the development branch specified by the
12
- # feature.development-branch git config value
13
- def self.development_branch
14
- dev_branch = `git config feature.development-branch`.strip
15
- if !dev_branch || $? != 0
16
- die("No development branch specified; set it with: " +
17
- "git config feature.development-branch master")
11
+ # Return the specified branch in the feature git config section.
12
+ def self.get_branch(branch = '')
13
+ specified_branch = `git config feature.#{branch.shellescape}-branch`.strip
14
+ if specified_branch.empty? || $? != 0
15
+ die("No #{branch} branch specified; set it with:\n" +
16
+ "git config feature.#{branch}-branch \"name-of-branch\"")
18
17
  end
19
- dev_branch
18
+ return specified_branch
20
19
  end
21
20
 
22
21
  # Returns the editor specified in the user's gitconfig.
@@ -62,10 +61,11 @@ module Git
62
61
 
63
62
  # Returns an array of unmerged hotfix branches
64
63
  def self.hotfix_branches(type)
64
+ stable_branch = get_branch('stable')
65
65
  branches = if type == :unmerged
66
- self.branches_not_merged_into('stable')
66
+ self.branches_not_merged_into(stable_branch)
67
67
  elsif type == :merged
68
- self.merged_branches('stable')
68
+ self.merged_branches(stable_branch)
69
69
  else
70
70
  raise ArgumentError, 'Must specify :merged or :unmerged in hotfix_branches.'
71
71
  end
@@ -75,7 +75,7 @@ module Git
75
75
 
76
76
  # Returns an array of unmerged feature branches
77
77
  def self.feature_branches(type)
78
- devBranch = development_branch()
78
+ devBranch = get_branch('development')
79
79
 
80
80
  branches = if type == :unmerged
81
81
  self.branches_not_merged_into(devBranch)
data/lib/github.rb CHANGED
@@ -133,14 +133,15 @@ Body of pull-request
133
133
  msg.write(message)
134
134
  msg.close
135
135
 
136
- # -c blah only works for vim
137
- if (ENV['EDITOR'].include?('vim'))
138
- opts = "-c \":set filetype=gitcommit\""
136
+ editor = Git::editor
137
+ if (editor == 'vim')
138
+ opts = "'+set ft=gitcommit' '+set textwidth=72'" +
139
+ " '+setlocal spell spelllang=en_us'"
139
140
  else
140
141
  opts = ""
141
142
  end
142
143
 
143
- system("$EDITOR #{opts} #{msg.path.shellescape}")
144
+ system("#{editor} #{opts} #{msg.path.shellescape}")
144
145
  full_message = File.open(msg.path, "r").read
145
146
  lines = full_message.split("\n")
146
147
  lines = lines.reject {|line| line =~ /^\s*#/ }
@@ -161,22 +162,49 @@ Body of pull-request
161
162
  }
162
163
  end
163
164
 
164
- def self.get_pull_request_description_from_api(branch_name, into_branch)
165
+ def self.get_pull_request_info_from_api(branch_name, into_branch)
165
166
  octokit = Github::api
166
167
  # Should succeed if authentication is set up.
167
- pulls = octokit.pulls(Github::get_github_repo)
168
+ repo = Github::get_github_repo
169
+ pulls = octokit.pulls(repo)
168
170
  pull = pulls.find {|pull| branch_name == pull[:head][:ref] }
169
171
 
170
172
  if pull
171
- return <<-MSG
173
+ # This will grab the latest commit and retrieve the state from it.
174
+ sha = pull[:head][:sha]
175
+ state = octokit.statuses(repo, sha).shift
176
+ state = state ? state[:state] : 'none'
177
+
178
+ desc = <<-MSG
172
179
  Merge #{branch_name} (##{pull[:number]}) into #{into_branch}
173
180
 
174
181
  #{pull[:title].gsub("\r", '')}
175
182
 
176
183
  #{pull[:body].gsub("\r", '')}
177
184
  MSG
185
+
186
+ return {:status => state, :description => desc}
187
+ else
188
+ return {:status => nil, :description => "Merge #{branch_name} into #{into_branch}"}
189
+ end
190
+ end
191
+
192
+ def self.get_commit_status_warning(status)
193
+ warning = 'Merge with caution.'
194
+ case status
195
+ when 'failure'
196
+ return 'This pull request has failed to pass continuous integration' +
197
+ " tests. #{warning}"
198
+ when 'pending'
199
+ return "Continuous integration tests have not finished. #{warning}"
200
+ when 'error'
201
+ return "Build tests were not able to complete. #{warning}"
202
+ when 'none'
203
+ return 'Continuous integration has not been set up.'
204
+ when nil
205
+ return 'No pull request found for this branch.'
178
206
  else
179
- return "Merge #{branch_name} into #{into_branch}"
207
+ return ''
180
208
  end
181
209
  end
182
210
  end
data/lib/helpers.rb CHANGED
@@ -17,7 +17,7 @@ def display_feature_help(command = nil, message = nil)
17
17
  :switch => "feature switch (name-of-feature | -n number-of-feature) [--clean]",
18
18
  :finish => "feature finish [name-of-feature]",
19
19
  :'finish-issue' => "feature finish-issue issue-number",
20
- :merge => "feature merge [name-of-feature]",
20
+ :merge => "feature merge (name-of-feature | -n number-of-feature)",
21
21
  :pull => "feature pull",
22
22
  :prune => "feature prune <local | origin> <preview | clean>",
23
23
  :status => "feature status",
@@ -40,7 +40,7 @@ def display_hotfix_help(command = nil, message = nil)
40
40
  :switch => "hotfix switch (name-of-hotfix | -n number-of-hotfix)",
41
41
  :finish => "hotfix finish [name-of-hotfix]",
42
42
  :'finish-issue' => "hotfix finish-issue issue-number",
43
- :merge => "hotfix merge [name-of-hotfix]"
43
+ :merge => "hotfix merge (name-of-hotfix | -n number-of-hotfix)",
44
44
  },
45
45
  :command_name => 'hotfix',
46
46
  :command => command,
data/man/feature-clean.1 CHANGED
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "FEATURE\-CLEAN" "1" "April 2013" "iFixit" ""
4
+ .TH "FEATURE\-CLEAN" "1" "September 2013" "iFixit" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBfeature\-clean\fR \- Remove untracked files and submodules\.
@@ -0,0 +1,120 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
6
+ <title>feature-clean(1) - Remove untracked files and submodules.</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ <style type='text/css' media='all'>
45
+ /* style: toc */
46
+ .man-navigation {display:block !important;position:fixed;top:0;left:113ex;height:100%;width:100%;padding:48px 0 0 0;border-left:1px solid #dbdbdb;background:#eee}
47
+ .man-navigation a,.man-navigation a:hover,.man-navigation a:link,.man-navigation a:visited {display:block;margin:0;padding:5px 2px 5px 30px;color:#999;text-decoration:none}
48
+ .man-navigation a:hover {color:#111;text-decoration:underline}
49
+ </style>
50
+ </head>
51
+ <!--
52
+ The following styles are deprecated and will be removed at some point:
53
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
54
+
55
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
56
+ .man-navigation should be used instead.
57
+ -->
58
+ <body id='manpage'>
59
+ <div class='mp' id='man'>
60
+
61
+ <div class='man-navigation' style='display:none'>
62
+ <a href="#NAME">NAME</a>
63
+ <a href="#SYNOPSIS">SYNOPSIS</a>
64
+ <a href="#DESCRIPTION">DESCRIPTION</a>
65
+ <a href="#OPTIONS">OPTIONS</a>
66
+ <a href="#COPYRIGHT">COPYRIGHT</a>
67
+ <a href="#SEE-ALSO">SEE ALSO</a>
68
+ <a href="#WWW">WWW</a>
69
+ </div>
70
+
71
+ <ol class='man-decor man-head man head'>
72
+ <li class='tl'>feature-clean(1)</li>
73
+ <li class='tc'></li>
74
+ <li class='tr'>feature-clean(1)</li>
75
+ </ol>
76
+
77
+ <h2 id="NAME">NAME</h2>
78
+ <p class="man-name">
79
+ <code>feature-clean</code> - <span class="man-whatis">Remove untracked files and submodules.</span>
80
+ </p>
81
+
82
+ <h2 id="SYNOPSIS">SYNOPSIS</h2>
83
+
84
+ <p><code>feature clean</code> [--all]</p>
85
+
86
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
87
+
88
+ <p>Remove untracked files and submodules.</p>
89
+
90
+ <p>Compatible with hotfix branches.</p>
91
+
92
+ <h2 id="OPTIONS">OPTIONS</h2>
93
+
94
+ <dl>
95
+ <dt> <code>--clean</code></dt><dd> Remove all untracked .gitignored files as well.</dd>
96
+ </dl>
97
+
98
+
99
+ <h2 id="COPYRIGHT">COPYRIGHT</h2>
100
+
101
+ <p>Copyright (c) 2012-2013 iFixit.</p>
102
+
103
+ <h2 id="SEE-ALSO">SEE ALSO</h2>
104
+
105
+ <p><a class="man-ref" href="feature.1.html">feature<span class="s">(1)</span></a></p>
106
+
107
+ <h2 id="WWW">WWW</h2>
108
+
109
+ <p>https://github.com/iFixit/git-scripts</p>
110
+
111
+
112
+ <ol class='man-decor man-foot man foot'>
113
+ <li class='tl'>iFixit</li>
114
+ <li class='tc'>September 2013</li>
115
+ <li class='tr'>feature-clean(1)</li>
116
+ </ol>
117
+
118
+ </div>
119
+ </body>
120
+ </html>