git-multi 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1186 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
7
+ <meta name="generator" content="AsciiDoc 8.6.10" />
8
+ <title>git-multi(1)</title>
9
+ <style type="text/css">
10
+ /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
11
+
12
+ /* Default font. */
13
+ body {
14
+ font-family: Georgia,serif;
15
+ }
16
+
17
+ /* Title font. */
18
+ h1, h2, h3, h4, h5, h6,
19
+ div.title, caption.title,
20
+ thead, p.table.header,
21
+ #toctitle,
22
+ #author, #revnumber, #revdate, #revremark,
23
+ #footer {
24
+ font-family: Arial,Helvetica,sans-serif;
25
+ }
26
+
27
+ body {
28
+ margin: 1em 5% 1em 5%;
29
+ }
30
+
31
+ a {
32
+ color: blue;
33
+ text-decoration: underline;
34
+ }
35
+ a:visited {
36
+ color: fuchsia;
37
+ }
38
+
39
+ em {
40
+ font-style: italic;
41
+ color: navy;
42
+ }
43
+
44
+ strong {
45
+ font-weight: bold;
46
+ color: #083194;
47
+ }
48
+
49
+ h1, h2, h3, h4, h5, h6 {
50
+ color: #527bbd;
51
+ margin-top: 1.2em;
52
+ margin-bottom: 0.5em;
53
+ line-height: 1.3;
54
+ }
55
+
56
+ h1, h2, h3 {
57
+ border-bottom: 2px solid silver;
58
+ }
59
+ h2 {
60
+ padding-top: 0.5em;
61
+ }
62
+ h3 {
63
+ float: left;
64
+ }
65
+ h3 + * {
66
+ clear: left;
67
+ }
68
+ h5 {
69
+ font-size: 1.0em;
70
+ }
71
+
72
+ div.sectionbody {
73
+ margin-left: 0;
74
+ }
75
+
76
+ hr {
77
+ border: 1px solid silver;
78
+ }
79
+
80
+ p {
81
+ margin-top: 0.5em;
82
+ margin-bottom: 0.5em;
83
+ }
84
+
85
+ ul, ol, li > p {
86
+ margin-top: 0;
87
+ }
88
+ ul > li { color: #aaa; }
89
+ ul > li > * { color: black; }
90
+
91
+ .monospaced, code, pre {
92
+ font-family: "Courier New", Courier, monospace;
93
+ font-size: inherit;
94
+ color: navy;
95
+ padding: 0;
96
+ margin: 0;
97
+ }
98
+ pre {
99
+ white-space: pre-wrap;
100
+ }
101
+
102
+ #author {
103
+ color: #527bbd;
104
+ font-weight: bold;
105
+ font-size: 1.1em;
106
+ }
107
+ #email {
108
+ }
109
+ #revnumber, #revdate, #revremark {
110
+ }
111
+
112
+ #footer {
113
+ font-size: small;
114
+ border-top: 2px solid silver;
115
+ padding-top: 0.5em;
116
+ margin-top: 4.0em;
117
+ }
118
+ #footer-text {
119
+ float: left;
120
+ padding-bottom: 0.5em;
121
+ }
122
+ #footer-badges {
123
+ float: right;
124
+ padding-bottom: 0.5em;
125
+ }
126
+
127
+ #preamble {
128
+ margin-top: 1.5em;
129
+ margin-bottom: 1.5em;
130
+ }
131
+ div.imageblock, div.exampleblock, div.verseblock,
132
+ div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133
+ div.admonitionblock {
134
+ margin-top: 1.0em;
135
+ margin-bottom: 1.5em;
136
+ }
137
+ div.admonitionblock {
138
+ margin-top: 2.0em;
139
+ margin-bottom: 2.0em;
140
+ margin-right: 10%;
141
+ color: #606060;
142
+ }
143
+
144
+ div.content { /* Block element content. */
145
+ padding: 0;
146
+ }
147
+
148
+ /* Block element titles. */
149
+ div.title, caption.title {
150
+ color: #527bbd;
151
+ font-weight: bold;
152
+ text-align: left;
153
+ margin-top: 1.0em;
154
+ margin-bottom: 0.5em;
155
+ }
156
+ div.title + * {
157
+ margin-top: 0;
158
+ }
159
+
160
+ td div.title:first-child {
161
+ margin-top: 0.0em;
162
+ }
163
+ div.content div.title:first-child {
164
+ margin-top: 0.0em;
165
+ }
166
+ div.content + div.title {
167
+ margin-top: 0.0em;
168
+ }
169
+
170
+ div.sidebarblock > div.content {
171
+ background: #ffffee;
172
+ border: 1px solid #dddddd;
173
+ border-left: 4px solid #f0f0f0;
174
+ padding: 0.5em;
175
+ }
176
+
177
+ div.listingblock > div.content {
178
+ border: 1px solid #dddddd;
179
+ border-left: 5px solid #f0f0f0;
180
+ background: #f8f8f8;
181
+ padding: 0.5em;
182
+ }
183
+
184
+ div.quoteblock, div.verseblock {
185
+ padding-left: 1.0em;
186
+ margin-left: 1.0em;
187
+ margin-right: 10%;
188
+ border-left: 5px solid #f0f0f0;
189
+ color: #888;
190
+ }
191
+
192
+ div.quoteblock > div.attribution {
193
+ padding-top: 0.5em;
194
+ text-align: right;
195
+ }
196
+
197
+ div.verseblock > pre.content {
198
+ font-family: inherit;
199
+ font-size: inherit;
200
+ }
201
+ div.verseblock > div.attribution {
202
+ padding-top: 0.75em;
203
+ text-align: left;
204
+ }
205
+ /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
206
+ div.verseblock + div.attribution {
207
+ text-align: left;
208
+ }
209
+
210
+ div.admonitionblock .icon {
211
+ vertical-align: top;
212
+ font-size: 1.1em;
213
+ font-weight: bold;
214
+ text-decoration: underline;
215
+ color: #527bbd;
216
+ padding-right: 0.5em;
217
+ }
218
+ div.admonitionblock td.content {
219
+ padding-left: 0.5em;
220
+ border-left: 3px solid #dddddd;
221
+ }
222
+
223
+ div.exampleblock > div.content {
224
+ border-left: 3px solid #dddddd;
225
+ padding-left: 0.5em;
226
+ }
227
+
228
+ div.imageblock div.content { padding-left: 0; }
229
+ span.image img { border-style: none; vertical-align: text-bottom; }
230
+ a.image:visited { color: white; }
231
+
232
+ dl {
233
+ margin-top: 0.8em;
234
+ margin-bottom: 0.8em;
235
+ }
236
+ dt {
237
+ margin-top: 0.5em;
238
+ margin-bottom: 0;
239
+ font-style: normal;
240
+ color: navy;
241
+ }
242
+ dd > *:first-child {
243
+ margin-top: 0.1em;
244
+ }
245
+
246
+ ul, ol {
247
+ list-style-position: outside;
248
+ }
249
+ ol.arabic {
250
+ list-style-type: decimal;
251
+ }
252
+ ol.loweralpha {
253
+ list-style-type: lower-alpha;
254
+ }
255
+ ol.upperalpha {
256
+ list-style-type: upper-alpha;
257
+ }
258
+ ol.lowerroman {
259
+ list-style-type: lower-roman;
260
+ }
261
+ ol.upperroman {
262
+ list-style-type: upper-roman;
263
+ }
264
+
265
+ div.compact ul, div.compact ol,
266
+ div.compact p, div.compact p,
267
+ div.compact div, div.compact div {
268
+ margin-top: 0.1em;
269
+ margin-bottom: 0.1em;
270
+ }
271
+
272
+ tfoot {
273
+ font-weight: bold;
274
+ }
275
+ td > div.verse {
276
+ white-space: pre;
277
+ }
278
+
279
+ div.hdlist {
280
+ margin-top: 0.8em;
281
+ margin-bottom: 0.8em;
282
+ }
283
+ div.hdlist tr {
284
+ padding-bottom: 15px;
285
+ }
286
+ dt.hdlist1.strong, td.hdlist1.strong {
287
+ font-weight: bold;
288
+ }
289
+ td.hdlist1 {
290
+ vertical-align: top;
291
+ font-style: normal;
292
+ padding-right: 0.8em;
293
+ color: navy;
294
+ }
295
+ td.hdlist2 {
296
+ vertical-align: top;
297
+ }
298
+ div.hdlist.compact tr {
299
+ margin: 0;
300
+ padding-bottom: 0;
301
+ }
302
+
303
+ .comment {
304
+ background: yellow;
305
+ }
306
+
307
+ .footnote, .footnoteref {
308
+ font-size: 0.8em;
309
+ }
310
+
311
+ span.footnote, span.footnoteref {
312
+ vertical-align: super;
313
+ }
314
+
315
+ #footnotes {
316
+ margin: 20px 0 20px 0;
317
+ padding: 7px 0 0 0;
318
+ }
319
+
320
+ #footnotes div.footnote {
321
+ margin: 0 0 5px 0;
322
+ }
323
+
324
+ #footnotes hr {
325
+ border: none;
326
+ border-top: 1px solid silver;
327
+ height: 1px;
328
+ text-align: left;
329
+ margin-left: 0;
330
+ width: 20%;
331
+ min-width: 100px;
332
+ }
333
+
334
+ div.colist td {
335
+ padding-right: 0.5em;
336
+ padding-bottom: 0.3em;
337
+ vertical-align: top;
338
+ }
339
+ div.colist td img {
340
+ margin-top: 0.3em;
341
+ }
342
+
343
+ @media print {
344
+ #footer-badges { display: none; }
345
+ }
346
+
347
+ #toc {
348
+ margin-bottom: 2.5em;
349
+ }
350
+
351
+ #toctitle {
352
+ color: #527bbd;
353
+ font-size: 1.1em;
354
+ font-weight: bold;
355
+ margin-top: 1.0em;
356
+ margin-bottom: 0.1em;
357
+ }
358
+
359
+ div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
360
+ margin-top: 0;
361
+ margin-bottom: 0;
362
+ }
363
+ div.toclevel2 {
364
+ margin-left: 2em;
365
+ font-size: 0.9em;
366
+ }
367
+ div.toclevel3 {
368
+ margin-left: 4em;
369
+ font-size: 0.9em;
370
+ }
371
+ div.toclevel4 {
372
+ margin-left: 6em;
373
+ font-size: 0.9em;
374
+ }
375
+
376
+ span.aqua { color: aqua; }
377
+ span.black { color: black; }
378
+ span.blue { color: blue; }
379
+ span.fuchsia { color: fuchsia; }
380
+ span.gray { color: gray; }
381
+ span.green { color: green; }
382
+ span.lime { color: lime; }
383
+ span.maroon { color: maroon; }
384
+ span.navy { color: navy; }
385
+ span.olive { color: olive; }
386
+ span.purple { color: purple; }
387
+ span.red { color: red; }
388
+ span.silver { color: silver; }
389
+ span.teal { color: teal; }
390
+ span.white { color: white; }
391
+ span.yellow { color: yellow; }
392
+
393
+ span.aqua-background { background: aqua; }
394
+ span.black-background { background: black; }
395
+ span.blue-background { background: blue; }
396
+ span.fuchsia-background { background: fuchsia; }
397
+ span.gray-background { background: gray; }
398
+ span.green-background { background: green; }
399
+ span.lime-background { background: lime; }
400
+ span.maroon-background { background: maroon; }
401
+ span.navy-background { background: navy; }
402
+ span.olive-background { background: olive; }
403
+ span.purple-background { background: purple; }
404
+ span.red-background { background: red; }
405
+ span.silver-background { background: silver; }
406
+ span.teal-background { background: teal; }
407
+ span.white-background { background: white; }
408
+ span.yellow-background { background: yellow; }
409
+
410
+ span.big { font-size: 2em; }
411
+ span.small { font-size: 0.6em; }
412
+
413
+ span.underline { text-decoration: underline; }
414
+ span.overline { text-decoration: overline; }
415
+ span.line-through { text-decoration: line-through; }
416
+
417
+ div.unbreakable { page-break-inside: avoid; }
418
+
419
+
420
+ /*
421
+ * xhtml11 specific
422
+ *
423
+ * */
424
+
425
+ div.tableblock {
426
+ margin-top: 1.0em;
427
+ margin-bottom: 1.5em;
428
+ }
429
+ div.tableblock > table {
430
+ border: 3px solid #527bbd;
431
+ }
432
+ thead, p.table.header {
433
+ font-weight: bold;
434
+ color: #527bbd;
435
+ }
436
+ p.table {
437
+ margin-top: 0;
438
+ }
439
+ /* Because the table frame attribute is overriden by CSS in most browsers. */
440
+ div.tableblock > table[frame="void"] {
441
+ border-style: none;
442
+ }
443
+ div.tableblock > table[frame="hsides"] {
444
+ border-left-style: none;
445
+ border-right-style: none;
446
+ }
447
+ div.tableblock > table[frame="vsides"] {
448
+ border-top-style: none;
449
+ border-bottom-style: none;
450
+ }
451
+
452
+
453
+ /*
454
+ * html5 specific
455
+ *
456
+ * */
457
+
458
+ table.tableblock {
459
+ margin-top: 1.0em;
460
+ margin-bottom: 1.5em;
461
+ }
462
+ thead, p.tableblock.header {
463
+ font-weight: bold;
464
+ color: #527bbd;
465
+ }
466
+ p.tableblock {
467
+ margin-top: 0;
468
+ }
469
+ table.tableblock {
470
+ border-width: 3px;
471
+ border-spacing: 0px;
472
+ border-style: solid;
473
+ border-color: #527bbd;
474
+ border-collapse: collapse;
475
+ }
476
+ th.tableblock, td.tableblock {
477
+ border-width: 1px;
478
+ padding: 4px;
479
+ border-style: solid;
480
+ border-color: #527bbd;
481
+ }
482
+
483
+ table.tableblock.frame-topbot {
484
+ border-left-style: hidden;
485
+ border-right-style: hidden;
486
+ }
487
+ table.tableblock.frame-sides {
488
+ border-top-style: hidden;
489
+ border-bottom-style: hidden;
490
+ }
491
+ table.tableblock.frame-none {
492
+ border-style: hidden;
493
+ }
494
+
495
+ th.tableblock.halign-left, td.tableblock.halign-left {
496
+ text-align: left;
497
+ }
498
+ th.tableblock.halign-center, td.tableblock.halign-center {
499
+ text-align: center;
500
+ }
501
+ th.tableblock.halign-right, td.tableblock.halign-right {
502
+ text-align: right;
503
+ }
504
+
505
+ th.tableblock.valign-top, td.tableblock.valign-top {
506
+ vertical-align: top;
507
+ }
508
+ th.tableblock.valign-middle, td.tableblock.valign-middle {
509
+ vertical-align: middle;
510
+ }
511
+ th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512
+ vertical-align: bottom;
513
+ }
514
+
515
+
516
+ /*
517
+ * manpage specific
518
+ *
519
+ * */
520
+
521
+ body.manpage h1 {
522
+ padding-top: 0.5em;
523
+ padding-bottom: 0.5em;
524
+ border-top: 2px solid silver;
525
+ border-bottom: 2px solid silver;
526
+ }
527
+ body.manpage h2 {
528
+ border-style: none;
529
+ }
530
+ body.manpage div.sectionbody {
531
+ margin-left: 3em;
532
+ }
533
+
534
+ @media print {
535
+ body.manpage div#toc { display: none; }
536
+ }
537
+
538
+
539
+ </style>
540
+ <script type="text/javascript">
541
+ /*<![CDATA[*/
542
+ var asciidoc = { // Namespace.
543
+
544
+ /////////////////////////////////////////////////////////////////////
545
+ // Table Of Contents generator
546
+ /////////////////////////////////////////////////////////////////////
547
+
548
+ /* Author: Mihai Bazon, September 2002
549
+ * http://students.infoiasi.ro/~mishoo
550
+ *
551
+ * Table Of Content generator
552
+ * Version: 0.4
553
+ *
554
+ * Feel free to use this script under the terms of the GNU General Public
555
+ * License, as long as you do not remove or alter this notice.
556
+ */
557
+
558
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
559
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
560
+
561
+ // toclevels = 1..4.
562
+ toc: function (toclevels) {
563
+
564
+ function getText(el) {
565
+ var text = "";
566
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
567
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
568
+ text += i.data;
569
+ else if (i.firstChild != null)
570
+ text += getText(i);
571
+ }
572
+ return text;
573
+ }
574
+
575
+ function TocEntry(el, text, toclevel) {
576
+ this.element = el;
577
+ this.text = text;
578
+ this.toclevel = toclevel;
579
+ }
580
+
581
+ function tocEntries(el, toclevels) {
582
+ var result = new Array;
583
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
584
+ // Function that scans the DOM tree for header elements (the DOM2
585
+ // nodeIterator API would be a better technique but not supported by all
586
+ // browsers).
587
+ var iterate = function (el) {
588
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
589
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
590
+ var mo = re.exec(i.tagName);
591
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
592
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
593
+ }
594
+ iterate(i);
595
+ }
596
+ }
597
+ }
598
+ iterate(el);
599
+ return result;
600
+ }
601
+
602
+ var toc = document.getElementById("toc");
603
+ if (!toc) {
604
+ return;
605
+ }
606
+
607
+ // Delete existing TOC entries in case we're reloading the TOC.
608
+ var tocEntriesToRemove = [];
609
+ var i;
610
+ for (i = 0; i < toc.childNodes.length; i++) {
611
+ var entry = toc.childNodes[i];
612
+ if (entry.nodeName.toLowerCase() == 'div'
613
+ && entry.getAttribute("class")
614
+ && entry.getAttribute("class").match(/^toclevel/))
615
+ tocEntriesToRemove.push(entry);
616
+ }
617
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
618
+ toc.removeChild(tocEntriesToRemove[i]);
619
+ }
620
+
621
+ // Rebuild TOC entries.
622
+ var entries = tocEntries(document.getElementById("content"), toclevels);
623
+ for (var i = 0; i < entries.length; ++i) {
624
+ var entry = entries[i];
625
+ if (entry.element.id == "")
626
+ entry.element.id = "_toc_" + i;
627
+ var a = document.createElement("a");
628
+ a.href = "#" + entry.element.id;
629
+ a.appendChild(document.createTextNode(entry.text));
630
+ var div = document.createElement("div");
631
+ div.appendChild(a);
632
+ div.className = "toclevel" + entry.toclevel;
633
+ toc.appendChild(div);
634
+ }
635
+ if (entries.length == 0)
636
+ toc.parentNode.removeChild(toc);
637
+ },
638
+
639
+
640
+ /////////////////////////////////////////////////////////////////////
641
+ // Footnotes generator
642
+ /////////////////////////////////////////////////////////////////////
643
+
644
+ /* Based on footnote generation code from:
645
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
646
+ */
647
+
648
+ footnotes: function () {
649
+ // Delete existing footnote entries in case we're reloading the footnodes.
650
+ var i;
651
+ var noteholder = document.getElementById("footnotes");
652
+ if (!noteholder) {
653
+ return;
654
+ }
655
+ var entriesToRemove = [];
656
+ for (i = 0; i < noteholder.childNodes.length; i++) {
657
+ var entry = noteholder.childNodes[i];
658
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
659
+ entriesToRemove.push(entry);
660
+ }
661
+ for (i = 0; i < entriesToRemove.length; i++) {
662
+ noteholder.removeChild(entriesToRemove[i]);
663
+ }
664
+
665
+ // Rebuild footnote entries.
666
+ var cont = document.getElementById("content");
667
+ var spans = cont.getElementsByTagName("span");
668
+ var refs = {};
669
+ var n = 0;
670
+ for (i=0; i<spans.length; i++) {
671
+ if (spans[i].className == "footnote") {
672
+ n++;
673
+ var note = spans[i].getAttribute("data-note");
674
+ if (!note) {
675
+ // Use [\s\S] in place of . so multi-line matches work.
676
+ // Because JavaScript has no s (dotall) regex flag.
677
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
678
+ spans[i].innerHTML =
679
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
680
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
681
+ spans[i].setAttribute("data-note", note);
682
+ }
683
+ noteholder.innerHTML +=
684
+ "<div class='footnote' id='_footnote_" + n + "'>" +
685
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
686
+ n + "</a>. " + note + "</div>";
687
+ var id =spans[i].getAttribute("id");
688
+ if (id != null) refs["#"+id] = n;
689
+ }
690
+ }
691
+ if (n == 0)
692
+ noteholder.parentNode.removeChild(noteholder);
693
+ else {
694
+ // Process footnoterefs.
695
+ for (i=0; i<spans.length; i++) {
696
+ if (spans[i].className == "footnoteref") {
697
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
698
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
699
+ n = refs[href];
700
+ spans[i].innerHTML =
701
+ "[<a href='#_footnote_" + n +
702
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
703
+ }
704
+ }
705
+ }
706
+ },
707
+
708
+ install: function(toclevels) {
709
+ var timerId;
710
+
711
+ function reinstall() {
712
+ asciidoc.footnotes();
713
+ if (toclevels) {
714
+ asciidoc.toc(toclevels);
715
+ }
716
+ }
717
+
718
+ function reinstallAndRemoveTimer() {
719
+ clearInterval(timerId);
720
+ reinstall();
721
+ }
722
+
723
+ timerId = setInterval(reinstall, 500);
724
+ if (document.addEventListener)
725
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726
+ else
727
+ window.onload = reinstallAndRemoveTimer;
728
+ }
729
+
730
+ }
731
+ asciidoc.install();
732
+ /*]]>*/
733
+ </script>
734
+ </head>
735
+ <body class="manpage">
736
+ <div id="header">
737
+ <h1>
738
+ git-multi(1) Manual Page
739
+ </h1>
740
+ <h2>NAME</h2>
741
+ <div class="sectionbody">
742
+ <p>git-multi -
743
+ execute the same git command in multiple repositories
744
+ </p>
745
+ </div>
746
+ </div>
747
+ <div id="content">
748
+ <div class="sect1">
749
+ <h2 id="_version">VERSION</h2>
750
+ <div class="sectionbody">
751
+ <div class="paragraph"><p>This is <code>v1.0.3</code> of <em>git multi</em> &#8230; hooray!</p></div>
752
+ </div>
753
+ </div>
754
+ <div class="sect1">
755
+ <h2 id="_synopsis">SYNOPSIS</h2>
756
+ <div class="sectionbody">
757
+ <div class="paragraph"><p>There are some options for <code>git multi</code> itself, in which case it
758
+ is invoked as follows:</p></div>
759
+ <div class="verseblock">
760
+ <pre class="content"><em>git multi</em> &lt;dash_dash_option&gt; [&lt;option_arguments&gt;]</pre>
761
+ <div class="attribution">
762
+ </div></div>
763
+ <div class="paragraph"><p>To execute the same git command in multiple repositories, the
764
+ invocation is as follows:</p></div>
765
+ <div class="verseblock">
766
+ <pre class="content"><em>git multi</em> &lt;git_command&gt; [&lt;git_command_arguments&gt;]</pre>
767
+ <div class="attribution">
768
+ </div></div>
769
+ </div>
770
+ </div>
771
+ <div class="sect1">
772
+ <h2 id="_description">DESCRIPTION</h2>
773
+ <div class="sectionbody">
774
+ <div class="paragraph"><p>Convenient way to execute the same git command in a set of related repos,
775
+ currently the repositories of a GitHub user, incl. the organizations they
776
+ are a member of; the repo list is determined via a GitHub API v3 call, and
777
+ cached locally <em>(in binary format)</em> for performance and offline usage.</p></div>
778
+ </div>
779
+ </div>
780
+ <div class="sect1">
781
+ <h2 id="_options">OPTIONS</h2>
782
+ <div class="sectionbody">
783
+ <div class="dlist"><dl>
784
+ <dt class="hdlist1">
785
+ --help
786
+ </dt>
787
+ <dd>
788
+ <p>
789
+ you&#8217;re looking at it: show the man page
790
+ </p>
791
+ </dd>
792
+ <dt class="hdlist1">
793
+ --html
794
+ </dt>
795
+ <dd>
796
+ <p>
797
+ open the HTML version of the man page
798
+ </p>
799
+ </dd>
800
+ <dt class="hdlist1">
801
+ --check
802
+ </dt>
803
+ <dd>
804
+ <p>
805
+ checks all the required settings and configurations
806
+ </p>
807
+ </dd>
808
+ <dt class="hdlist1">
809
+ --version
810
+ </dt>
811
+ <dd>
812
+ <p>
813
+ print out this script&#8217;s version number
814
+ </p>
815
+ </dd>
816
+ <dt class="hdlist1">
817
+ --refresh
818
+ </dt>
819
+ <dd>
820
+ <p>
821
+ refresh the list of user &amp; organization repos
822
+ </p>
823
+ </dd>
824
+ <dt class="hdlist1">
825
+ --json
826
+ </dt>
827
+ <dd>
828
+ <p>
829
+ output repository details to JSON
830
+ </p>
831
+ </dd>
832
+ <dt class="hdlist1">
833
+ --count
834
+ </dt>
835
+ <dd>
836
+ <p>
837
+ print out the count of repos (per type)
838
+ </p>
839
+ </dd>
840
+ <dt class="hdlist1">
841
+ --list
842
+ </dt>
843
+ <dd>
844
+ <p>
845
+ print out the names of all repos
846
+ </p>
847
+ </dd>
848
+ <dt class="hdlist1">
849
+ --archived
850
+ </dt>
851
+ <dd>
852
+ <p>
853
+ print out the names of all repos
854
+ </p>
855
+ </dd>
856
+ <dt class="hdlist1">
857
+ --forked
858
+ </dt>
859
+ <dd>
860
+ <p>
861
+ print out the names of all repos
862
+ </p>
863
+ </dd>
864
+ <dt class="hdlist1">
865
+ --private
866
+ </dt>
867
+ <dd>
868
+ <p>
869
+ print out the names of all repos
870
+ </p>
871
+ </dd>
872
+ <dt class="hdlist1">
873
+ --paths
874
+ </dt>
875
+ <dd>
876
+ <p>
877
+ print out the full path for each repos
878
+ </p>
879
+ </dd>
880
+ <dt class="hdlist1">
881
+ --spurious
882
+ </dt>
883
+ <dd>
884
+ <p>
885
+ list cloned repos whose remote doesn&#8217;t match a github.com origin
886
+ </p>
887
+ </dd>
888
+ <dt class="hdlist1">
889
+ --missing
890
+ </dt>
891
+ <dd>
892
+ <p>
893
+ print out names of repos that haven&#8217;t been cloned
894
+ </p>
895
+ </dd>
896
+ <dt class="hdlist1">
897
+ --stale
898
+ </dt>
899
+ <dd>
900
+ <p>
901
+ list repos that have been deleted on github.com
902
+ </p>
903
+ </dd>
904
+ <dt class="hdlist1">
905
+ --excess
906
+ </dt>
907
+ <dd>
908
+ <p>
909
+ list repos that don&#8217;t exist on github.com
910
+ </p>
911
+ </dd>
912
+ <dt class="hdlist1">
913
+ --clone
914
+ </dt>
915
+ <dd>
916
+ <p>
917
+ clones missing repositories into <code>${HOME}/Workarea</code> (by default)
918
+ </p>
919
+ </dd>
920
+ <dt class="hdlist1">
921
+ --query (args)
922
+ </dt>
923
+ <dd>
924
+ <p>
925
+ query GitHub repo metadata for each repository
926
+ </p>
927
+ </dd>
928
+ <dt class="hdlist1">
929
+ --find &lt;ruby&gt;
930
+ </dt>
931
+ <dd>
932
+ <p>
933
+ print out the repos for which the Ruby code evaluates to true
934
+ </p>
935
+ </dd>
936
+ <dt class="hdlist1">
937
+ --eval &lt;ruby&gt;
938
+ </dt>
939
+ <dd>
940
+ <p>
941
+ execute the given Ruby code in the context of each repo
942
+ </p>
943
+ </dd>
944
+ <dt class="hdlist1">
945
+ --raw &lt;cmd&gt;
946
+ </dt>
947
+ <dd>
948
+ <p>
949
+ execute the given shell command inside each git repository
950
+ </p>
951
+ </dd>
952
+ </dl></div>
953
+ </div>
954
+ </div>
955
+ <div class="sect1">
956
+ <h2 id="_examples">EXAMPLES</h2>
957
+ <div class="sectionbody">
958
+ <div class="paragraph"><p>count the number of repos</p></div>
959
+ <div class="literalblock">
960
+ <div class="content">
961
+ <pre><code>git multi --list | wc -l</code></pre>
962
+ </div></div>
963
+ <div class="paragraph"><p>disk usage of each locally cloned repo</p></div>
964
+ <div class="literalblock">
965
+ <div class="content">
966
+ <pre><code>git multi --paths | xargs -n 1 du -hs</code></pre>
967
+ </div></div>
968
+ <div class="paragraph"><p>disk usage using the <code>--raw</code> option</p></div>
969
+ <div class="literalblock">
970
+ <div class="content">
971
+ <pre><code>git multi --raw 'du -hs .'</code></pre>
972
+ </div></div>
973
+ <div class="paragraph"><p>group and count the repos by GitHub-determined language</p></div>
974
+ <div class="literalblock">
975
+ <div class="content">
976
+ <pre><code>git multi --query language | cut -f 2 -d : | sort | uniq -c | sort -n -r</code></pre>
977
+ </div></div>
978
+ <div class="paragraph"><p>find out the most-used Ruby versions</p></div>
979
+ <div class="literalblock">
980
+ <div class="content">
981
+ <pre><code>git multi --raw '[ -f .ruby-version ] &amp;&amp; cat .ruby-version' | cut -f 2 -d : | sort | uniq -c | sort -n -r</code></pre>
982
+ </div></div>
983
+ <div class="paragraph"><p>find GitHub repos without a description</p></div>
984
+ <div class="literalblock">
985
+ <div class="content">
986
+ <pre><code>git multi --query description | egrep ': *$'</code></pre>
987
+ </div></div>
988
+ <div class="paragraph"><p>fetch remote branches for all repos</p></div>
989
+ <div class="literalblock">
990
+ <div class="content">
991
+ <pre><code>git multi fetch -p</code></pre>
992
+ </div></div>
993
+ <div class="paragraph"><p>print out the local branch for each repo</p></div>
994
+ <div class="literalblock">
995
+ <div class="content">
996
+ <pre><code>git multi rev-parse --abbrev-ref=strict HEAD</code></pre>
997
+ </div></div>
998
+ <div class="paragraph"><p>find all repos for which the <em>origin</em> remote isn&#8217;t github.com</p></div>
999
+ <div class="literalblock">
1000
+ <div class="content">
1001
+ <pre><code>git multi config --get remote.origin.url | fgrep -v git@github.com:</code></pre>
1002
+ </div></div>
1003
+ <div class="paragraph"><p>a kind of "repository creation" report: count the number of repos created in each quarter</p></div>
1004
+ <div class="literalblock">
1005
+ <div class="content">
1006
+ <pre><code>git multi --eval "class ::Time; def quarter() (month.to_f / 3.0).ceil; end; end; puts format('%d-Q%d', created_at.year, created_at.quarter)" | sort | uniq -c</code></pre>
1007
+ </div></div>
1008
+ <div class="paragraph"><p>for each repo, list all remote branches, sorted by the "age" of the last commit on each branch</p></div>
1009
+ <div class="literalblock">
1010
+ <div class="content">
1011
+ <pre><code>git multi for-each-ref --sort="-authordate" --format="%(refname)%09%(authordate:relative)%09%(authorname)" refs/remotes/origin</code></pre>
1012
+ </div></div>
1013
+ <div class="paragraph"><p>same as above, but columnize the generated output (NOTE: replace <em>^I</em> with CTRL-V/CTRL-I in your terminal)</p></div>
1014
+ <div class="literalblock">
1015
+ <div class="content">
1016
+ <pre><code>git multi for-each-ref --sort="-authordate" --format="%(refname)%09%(authordate:relative)%09%(authorname)" refs/remotes/origin | column -t -s "^I"</code></pre>
1017
+ </div></div>
1018
+ <div class="paragraph"><p>same as above, but refresh the list of remote branches first</p></div>
1019
+ <div class="literalblock">
1020
+ <div class="content">
1021
+ <pre><code>git multi fetch -p ; git multi for-each-ref --sort="-authordate" --format="%(refname)%09%(authordate:relative)%09%(authorname)" refs/remotes/origin</code></pre>
1022
+ </div></div>
1023
+ <div class="paragraph"><p>find all Rails projects</p></div>
1024
+ <div class="literalblock">
1025
+ <div class="content">
1026
+ <pre><code>git multi --raw '[ -f Gemfile ] &amp;&amp; fgrep -q -l rails Gemfile &amp;&amp; echo uses Rails' | cat</code></pre>
1027
+ </div></div>
1028
+ <div class="paragraph"><p>find all Mongoid dependencies</p></div>
1029
+ <div class="literalblock">
1030
+ <div class="content">
1031
+ <pre><code>git multi --raw '[ -f Gemfile.lock ] &amp;&amp; egrep -i "^ mongoid (.*)" Gemfile.lock' | column -s: -t</code></pre>
1032
+ </div></div>
1033
+ <div class="paragraph"><p>find all projects that have been pushed to in the last week</p></div>
1034
+ <div class="literalblock">
1035
+ <div class="content">
1036
+ <pre><code>git multi --find '((Time.now - pushed_at) / 60 / 60 / 24) &lt;= 7'</code></pre>
1037
+ </div></div>
1038
+ <div class="paragraph"><p>print out the number of days since the last push to each repository</p></div>
1039
+ <div class="literalblock">
1040
+ <div class="content">
1041
+ <pre><code>git multi --eval 'puts "%d days" % ((Time.now - pushed_at) / 60 / 60 / 24)'</code></pre>
1042
+ </div></div>
1043
+ <div class="paragraph"><p>find all projects that have seen activity this calendar year</p></div>
1044
+ <div class="literalblock">
1045
+ <div class="content">
1046
+ <pre><code>git multi --find 'pushed_at &gt;= Date.civil(Date.today.year, 1, 1).to_time'</code></pre>
1047
+ </div></div>
1048
+ <div class="paragraph"><p>print out all webhooks</p></div>
1049
+ <div class="literalblock">
1050
+ <div class="content">
1051
+ <pre><code>git multi --eval '(hooks = client.hooks(project.full_name)).any? &amp;&amp; begin print project.full_name ; print "\t" ; puts hooks.map { |hook| ["", hook.name, hook.config.url].join("\t") } ; end'</code></pre>
1052
+ </div></div>
1053
+ <div class="paragraph"><p>print out all deploy keys</p></div>
1054
+ <div class="literalblock">
1055
+ <div class="content">
1056
+ <pre><code>git multi --eval '(keys = client.list_deploy_keys(project.full_name)).any? &amp;&amp; begin print project.full_name ; print "\t" ; puts keys.map(&amp;:title).sort.join("\t") ; end'</code></pre>
1057
+ </div></div>
1058
+ <div class="paragraph"><p>find all organization repositories that depend on a given org repo, e.g. <em>business_rules</em></p></div>
1059
+ <div class="literalblock">
1060
+ <div class="content">
1061
+ <pre><code>git multi --graph | fgrep business_rules</code></pre>
1062
+ </div></div>
1063
+ <div class="paragraph"><p>generate a dependency graph of all organization repositories using yuml.me</p></div>
1064
+ <div class="literalblock">
1065
+ <div class="content">
1066
+ <pre><code>DEPENDENCIES=$( git multi --graph | ruby -n -e 'parent, children = $_.split(": ") ; puts children.split(" ").map { |child| "[#{parent}]-&gt;[#{child}]" }' | tr '\n' ',' ) ; open "http://yuml.me/diagram/scruffy/class/${DEPENDENCIES}"</code></pre>
1067
+ </div></div>
1068
+ <div class="paragraph"><p>generate a dependency graph of all organization repositories using Graphviz</p></div>
1069
+ <div class="literalblock">
1070
+ <div class="content">
1071
+ <pre><code>git multi --graph | ruby -n -e 'parent, children = $_.split(": ") ; puts children.split(" ").map { |child| "\"#{parent}\"-&gt;\"#{child}\";" }' | awk 'BEGIN { print "digraph {\nrankdir=\"LR\";\n" } ; { print ; } END { print "}\n" } ; ' | dot -Tpng &gt; /tmp/ghor.png ; open -a Preview /tmp/ghor.png</code></pre>
1072
+ </div></div>
1073
+ </div>
1074
+ </div>
1075
+ <div class="sect1">
1076
+ <h2 id="_query_arguments">QUERY ARGUMENTS</h2>
1077
+ <div class="sectionbody">
1078
+ <div class="paragraph"><p>The following is a list of valid arguments for the <code>git multi --query</code> option:</p></div>
1079
+ <div class="literalblock">
1080
+ <div class="content">
1081
+ <pre><code>archive_url archived assignees_url
1082
+ blobs_url branches_url clone_url
1083
+ collaborators_url comments_url commits_url
1084
+ compare_url contents_url contributors_url
1085
+ created_at default_branch deployments_url
1086
+ description downloads_url events_url
1087
+ fork forks forks_count
1088
+ forks_url full_name git_commits_url
1089
+ git_refs_url git_tags_url git_url
1090
+ has_downloads has_issues has_pages
1091
+ has_projects has_wiki homepage
1092
+ hooks_url html_url id
1093
+ issue_comment_url issue_events_url issues_url
1094
+ keys_url labels_url language
1095
+ languages_url license merges_url
1096
+ milestones_url mirror_url name
1097
+ network_count node_id notifications_url
1098
+ open_issues open_issues_count organization
1099
+ owner permissions private
1100
+ pulls_url pushed_at releases_url
1101
+ size ssh_url stargazers_count
1102
+ stargazers_url statuses_url subscribers_count
1103
+ subscribers_url subscription_url svn_url
1104
+ tags_url teams_url trees_url
1105
+ updated_at url watchers
1106
+ watchers_count</code></pre>
1107
+ </div></div>
1108
+ </div>
1109
+ </div>
1110
+ <div class="sect1">
1111
+ <h2 id="_jq_integration">JQ INTEGRATION</h2>
1112
+ <div class="sectionbody">
1113
+ <div class="paragraph"><p><code>jq</code> is like <code>sed</code> for JSON data&#8230; all of the above query arguments can be
1114
+ used in conjunction with <code>jq</code> to query, filter, map and transform the GitHub
1115
+ repository attributes stored in the local, binary repository cache; here
1116
+ are some examples:</p></div>
1117
+ <div class="literalblock">
1118
+ <div class="content">
1119
+ <pre><code># print out each repository's name and its description
1120
+ git multi --json | jq '.[] | .name + ": " + .description'</code></pre>
1121
+ </div></div>
1122
+ <div class="literalblock">
1123
+ <div class="content">
1124
+ <pre><code># print out the name of all "forked" repositories
1125
+ git multi --json | jq '.[] | select(.fork == true) | .full_name'</code></pre>
1126
+ </div></div>
1127
+ </div>
1128
+ </div>
1129
+ <div class="sect1">
1130
+ <h2 id="_files">FILES</h2>
1131
+ <div class="sectionbody">
1132
+ <div class="dlist"><dl>
1133
+ <dt class="hdlist1">
1134
+ <code>${HOME}/Workarea</code>
1135
+ </dt>
1136
+ <dd>
1137
+ <p>
1138
+ root directory where repos will been cloned
1139
+ </p>
1140
+ </dd>
1141
+ <dt class="hdlist1">
1142
+ <code>${HOME}/.git/multi/repositories.byte</code>
1143
+ </dt>
1144
+ <dd>
1145
+ <p>
1146
+ local, binary cache of GitHub repository metadata
1147
+ </p>
1148
+ </dd>
1149
+ </dl></div>
1150
+ </div>
1151
+ </div>
1152
+ <div class="sect1">
1153
+ <h2 id="_references">REFERENCES</h2>
1154
+ <div class="sectionbody">
1155
+ <div class="ulist"><ul>
1156
+ <li>
1157
+ <p>
1158
+ homepage for <code>git-multi</code>:
1159
+ <a href="https://github.com/pvdb/git-multi">https://github.com/pvdb/git-multi</a>
1160
+ </p>
1161
+ </li>
1162
+ <li>
1163
+ <p>
1164
+ the GitHub API:
1165
+ <a href="https://developer.github.com/v3/">https://developer.github.com/v3/</a>
1166
+ </p>
1167
+ </li>
1168
+ <li>
1169
+ <p>
1170
+ the <code>jq</code> command-line utility:
1171
+ <a href="http://stedolan.github.io/jq/">http://stedolan.github.io/jq/</a>
1172
+ </p>
1173
+ </li>
1174
+ </ul></div>
1175
+ </div>
1176
+ </div>
1177
+ </div>
1178
+ <div id="footnotes"><hr /></div>
1179
+ <div id="footer">
1180
+ <div id="footer-text">
1181
+ Last updated
1182
+ 2018-09-21 17:15:51 BST
1183
+ </div>
1184
+ </div>
1185
+ </body>
1186
+ </html>