git-scripts 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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>