git-multi 1.0.3 → 1.0.4

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.
@@ -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>