1
1
My First Contribution to the Git Project
2
2
========================================
3
+ :sectanchors:
3
4
5
+ [[summary]]
4
6
== Summary
5
7
6
8
This is a tutorial demonstrating the end-to-end workflow of creating a change to
7
9
the Git tree, sending it for review, and making changes based on comments.
8
10
11
+ [[prerequisites]]
9
12
=== Prerequisites
10
13
11
14
This tutorial assumes you're already fairly familiar with using Git to manage
12
15
source code. The Git workflow steps will largely remain unexplained.
13
16
17
+ [[related-reading]]
14
18
=== Related Reading
15
19
16
20
This tutorial aims to summarize the following documents, but the reader may find
@@ -19,8 +23,10 @@ useful additional context:
19
23
- `Documentation/SubmittingPatches`
20
24
- `Documentation/howto/new-command.txt`
21
25
26
+ [[getting-started]]
22
27
== Getting Started
23
28
29
+ [[cloning]]
24
30
=== Clone the Git Repository
25
31
26
32
Git is mirrored in a number of locations. Clone the repository from one of them;
@@ -31,6 +37,7 @@ the official mirror on GitHub.
31
37
$ git clone https://github.com/git/git git
32
38
----
33
39
40
+ [[identify-problem]]
34
41
=== Identify Problem to Solve
35
42
36
43
////
@@ -44,6 +51,7 @@ of invocation during users' typical daily workflow.
44
51
(We've seen some other effort in this space with the implementation of popular
45
52
commands such as `sl`.)
46
53
54
+ [[setup-workspace]]
47
55
=== Set Up Your Workspace
48
56
49
57
Let's start by making a development branch to work on our changes. Per
@@ -62,11 +70,13 @@ $ git checkout -b psuh origin/master
62
70
We'll make a number of commits here in order to demonstrate how to send a topic
63
71
with multiple patches up for review simultaneously.
64
72
73
+ [[code-it-up]]
65
74
== Code It Up!
66
75
67
76
NOTE: A reference implementation can be found at
68
77
https://github.com/nasamuffin/git/tree/psuh.
69
78
79
+ [[add-new-command]]
70
80
=== Adding a New Command
71
81
72
82
Lots of the subcommands are written as builtins, which means they are
@@ -195,6 +205,7 @@ For the remainder of the tutorial, the subject line only will be listed for the
195
205
sake of brevity. However, fully-fleshed example commit messages are available
196
206
on the reference implementation linked at the top of this document.
197
207
208
+ [[implementation]]
198
209
=== Implementation
199
210
200
211
It's probably useful to do at least something besides printing out a string.
@@ -359,6 +370,7 @@ about. Neat! Let's commit that as well.
359
370
$ git commit -sm "psuh: display the top of origin/master"
360
371
----
361
372
373
+ [[add-documentation]]
362
374
=== Adding Documentation
363
375
364
376
Awesome! You've got a fantastic new command that you're ready to share with the
@@ -446,6 +458,7 @@ sees that your command has been implemented as well as documented) by running
446
458
447
459
Go ahead and commit your new documentation change.
448
460
461
+ [[add-usage]]
449
462
=== Adding Usage Text
450
463
451
464
Try and run `./bin-wrappers/git psuh -h`. Your command should crash at the end.
@@ -502,6 +515,7 @@ your command terminated before anything else interesting happens. Great!
502
515
503
516
Go ahead and commit this one, too.
504
517
518
+ [[testing]]
505
519
== Testing
506
520
507
521
It's important to test your code - even for a little toy command like this one.
@@ -516,11 +530,13 @@ So let's write some tests.
516
530
517
531
Related reading: `t/README`
518
532
533
+ [[overview-test-structure]]
519
534
=== Overview of Testing Structure
520
535
521
536
The tests in Git live in `t/` and are named with a 4-digit decimal number using
522
537
the schema shown in the Naming Tests section of `t/README`.
523
538
539
+ [[write-new-test]]
524
540
=== Writing Your Test
525
541
526
542
Since this a toy command, let's go ahead and name the test with t9999. However,
@@ -569,6 +585,7 @@ You can get an idea of whether you created your new test script successfully
569
585
by running `make -C t test-lint`, which will check for things like test number
570
586
uniqueness, executable bit, and so on.
571
587
588
+ [[local-test]]
572
589
=== Running Locally
573
590
574
591
Let's try and run locally:
@@ -592,6 +609,7 @@ dependencies. `prove` also makes the output nicer.
592
609
593
610
Go ahead and commit this change, as well.
594
611
612
+ [[ready-to-share]]
595
613
== Getting Ready to Share
596
614
597
615
You may have noticed already that the Git project performs its code reviews via
@@ -614,6 +632,7 @@ Regardless of which method you choose, your engagement with reviewers will be
614
632
the same; the review process will be covered after the sections on GitGitGadget
615
633
and `git send-email`.
616
634
635
+ [[howto-ggg]]
617
636
== Sending Patches via GitGitGadget
618
637
619
638
One option for sending patches is to follow a typical pull request workflow and
@@ -624,6 +643,7 @@ mirror of the Git project, and does some magic to turn the PR into a set of
624
643
emails and send them out for you. It also runs the Git continuous integration
625
644
suite for you. It's documented at http://gitgitgadget.github.io.
626
645
646
+ [[create-fork]]
627
647
=== Forking `git/git` on GitHub
628
648
629
649
Before you can send your patch off to be reviewed using GitGitGadget, you will
@@ -633,6 +653,7 @@ you have a GitHub account.
633
653
Head to the https://github.com/git/git[GitHub mirror] and look for the Fork
634
654
button. Place your fork wherever you deem appropriate and create it.
635
655
656
+ [[upload-to-fork]]
636
657
=== Uploading to Your Own Fork
637
658
638
659
To upload your branch to your own fork, you'll need to add the new fork as a
@@ -678,6 +699,7 @@ $ git push remotename psuh
678
699
679
700
Now you should be able to go and check out your newly created branch on GitHub.
680
701
702
+ [[send-pr-ggg]]
681
703
=== Sending a PR to GitGitGadget
682
704
683
705
In order to have your code tested and formatted for review, you need to start by
@@ -689,6 +711,7 @@ appear with the name of your newly pushed branch.
689
711
Review the PR's title and description, as it's used by GitGitGadget as the cover
690
712
letter for your change. When you're happy, submit your pull request.
691
713
714
+ [[run-ci-ggg]]
692
715
=== Running CI and Getting Ready to Send
693
716
694
717
If it's your first time using GitGitGadget (which is likely, as you're using
@@ -713,15 +736,18 @@ your patch is accepted into `next`.
713
736
TODO https://github.com/gitgitgadget/gitgitgadget/issues/83
714
737
It'd be nice to be able to verify that the patch looks good before sending it
715
738
to everyone on Git mailing list.
739
+ [[check-work-ggg]]
716
740
=== Check Your Work
717
741
////
718
742
743
+ [[send-mail-ggg]]
719
744
=== Sending Your Patches
720
745
721
746
Now that your CI is passing and someone has granted you permission to use
722
747
GitGitGadget with the `/allow` command, sending out for review is as simple as
723
748
commenting on your PR with `/submit`.
724
749
750
+ [[responding-ggg]]
725
751
=== Updating With Comments
726
752
727
753
Skip ahead to <<reviewing,Responding to Reviews>> for information on how to
@@ -743,6 +769,7 @@ of what they're looking at. When the CI is done running, you can comment once
743
769
more with `/submit` - GitGitGadget will automatically add a v2 mark to your
744
770
changes.
745
771
772
+ [[howto-git-send-email]]
746
773
== Sending Patches with `git send-email`
747
774
748
775
If you don't want to use GitGitGadget, you can also use Git itself to mail your
@@ -751,6 +778,7 @@ subject line (for example, being able to use the tag [RFC PATCH] in the subject)
751
778
and being able to send a ``dry run'' mail to yourself to ensure it all looks
752
779
good before going out to the list.
753
780
781
+ [[setup-git-send-email]]
754
782
=== Prerequisite: Setting Up `git send-email`
755
783
756
784
Configuration for `send-email` can vary based on your operating system and email
@@ -762,6 +790,7 @@ determine the right way to configure it to use your SMTP server; again, as this
762
790
configuration can change significantly based on your system and email setup, it
763
791
is out of scope for the context of this tutorial.
764
792
793
+ [[format-patch]]
765
794
=== Preparing Initial Patchset
766
795
767
796
Sending emails with Git is a two-part process; before you can prepare the emails
@@ -800,6 +829,7 @@ but want reviewers to look at what they have so far. You can add this flag with
800
829
Check and make sure that your patches and cover letter template exist in the
801
830
directory you specified - you're nearly ready to send out your review!
802
831
832
+ [[cover-letter]]
803
833
=== Preparing Email
804
834
805
835
In addition to an email per patch, the Git community also expects your patches
@@ -863,6 +893,7 @@ The one generated for `psuh` from the sample implementation looks like this:
863
893
Finally, the letter will include the version of Git used to generate the
864
894
patches. You can leave that string alone.
865
895
896
+ [[sending-git-send-email]]
866
897
=== Sending Email
867
898
868
899
At this point you should have a directory `psuh/` which is filled with your
@@ -887,6 +918,7 @@ press `y` or `a` at these prompts your emails will be sent! Congratulations!
887
918
Awesome, now the community will drop everything and review your changes. (Just
888
919
kidding - be patient!)
889
920
921
+ [[v2-git-send-email]]
890
922
=== Sending v2
891
923
892
924
Skip ahead to <<reviewing,Responding to Reviews>> for information on how to
945
977
psuh/v2*
946
978
----
947
979
980
+ [[single-patch]]
948
981
=== Bonus Chapter: One-Patch Changes
949
982
950
983
In some cases, your very small change may consist of only one patch. When that
@@ -992,6 +1025,7 @@ index 88f126184c..38da593a60 100644
992
1025
2.21.0.392.gf8f6787159e-goog
993
1026
----
994
1027
1028
+ [[now-what]]
995
1029
== My Patch Got Emailed - Now What?
996
1030
997
1031
[[reviewing]]
@@ -1035,6 +1069,7 @@ changing history, but since it's local history which you haven't shared with
1035
1069
anyone, that is okay for now! (Later, it may not make sense to do this; take a
1036
1070
look at the section below this one for some context.)
1037
1071
1072
+ [[after-approval]]
1038
1073
=== After Review Approval
1039
1074
1040
1075
The Git project has four integration branches: `pu`, `next`, `master`, and
0 commit comments