发布于 2015-08-27 16:44:57 | 152 次阅读 | 评论: 0 | 来源: 网络整理
Patches are the best way to provide a bug fix or to propose enhancements to Symfony.
Before working on Symfony, setup a friendly environment with the following software:
Set up your user information with your real name and a working email address:
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
小技巧
If you are new to Git, you are highly recommended to read the excellent and free ProGit book.
小技巧
If your IDE creates configuration files inside the project’s directory,
you can use global .gitignore
file (for all projects) or
.git/info/exclude
file (per project) to ignore them. See
GitHub’s documentation.
小技巧
Windows users: when installing Git, the installer will ask what to do with line endings, and suggests replacing all LF with CRLF. This is the wrong setting if you wish to contribute to Symfony! Selecting the as-is method is your best choice, as Git will convert your line feeds to the ones in the repository. If you have already installed Git, you can check the value of this setting by typing:
$ git config core.autocrlf
This will return either “false”, “input” or “true”; “true” and “false” being the wrong values. Change it to “input” by typing:
$ git config --global core.autocrlf input
Replace –global by –local if you want to set it only for the active repository
Get the Symfony source code:
symfony
directory):$ git clone git@github.com:USERNAME/symfony.git
$ cd symfony
$ git remote add upstream git://github.com/symfony/symfony.git
Before you start, you must know that all the patches you are going to submit must be released under the MIT license, unless explicitly specified in your commits.
Before working on a patch, you must determine on which branch you need to work:
2.3
, if you are fixing a bug for an existing feature (you may have
to choose a higher branch if the feature you are fixing was introduced
in a later version);2.7
, if you are adding a new feature which is backward compatible;master
, if you are adding a new and backward incompatible feature.注解
All bug fixes merged into maintenance branches are also merged into more
recent branches on a regular basis. For instance, if you submit a patch
for the 2.3
branch, the patch will also be applied by the core team on
the master
branch.
Each time you want to work on a patch for a bug or on an enhancement, create a topic branch:
$ git checkout -b BRANCH_NAME master
Or, if you want to provide a bugfix for the 2.3
branch, first track the remote
2.3
branch locally:
$ git checkout -t origin/2.3
Then create a new branch off the 2.3
branch to work on the bugfix:
$ git checkout -b BRANCH_NAME 2.3
小技巧
Use a descriptive name for your branch (ticket_XXX
where XXX
is the
ticket number is a good convention for bug fixes).
The above checkout commands automatically switch the code to the newly created
branch (check the branch you are working on with git branch
).
Work on the code as much as you want and commit as much as you want; but keep in mind the following:
git diff --check
to check for
trailing spaces – also read the tip below);git rebase
to
have a clean and logical history);小技巧
When submitting pull requests, fabbot checks your code for common typos and verifies that you are using the PHP coding standards as defined in PSR-1 and PSR-2.
A status is posted below the pull request description with a summary of any problems it detects or any Travis CI build failures.
小技巧
A good commit message is composed of a summary (the first line),
optionally followed by a blank line and a more detailed description. The
summary should start with the Component you are working on in square
brackets ([DependencyInjection]
, [FrameworkBundle]
, ...). Use a
verb (fixed ...
, added ...
, ...) to start the summary and don’t
add a period at the end.
When your patch is not about a bug fix (when you add a new feature or change an existing one for instance), it must also include the following:
CHANGELOG
file(s) (the
[BC BREAK]
or the [DEPRECATION]
prefix must be used when relevant);UPGRADE
file(s) if the changes break backward compatibility or if you
deprecate something that will ultimately break backward compatibility.Whenever you feel that your patch is ready for submission, follow the following steps.
Before submitting your patch, update your branch (needed if it takes you a while to finish your changes):
$ git checkout master
$ git fetch upstream
$ git merge upstream/master
$ git checkout BRANCH_NAME
$ git rebase master
小技巧
Replace master
with the branch you selected previously (e.g. 2.3
)
if you are working on a bugfix
When doing the rebase
command, you might have to fix merge conflicts.
git status
will show you the unmerged files. Resolve all the conflicts,
then continue the rebase:
$ git add ... # add resolved files
$ git rebase --continue
Check that all tests still pass and push your branch remotely:
$ git push --force origin BRANCH_NAME
You can now make a pull request on the symfony/symfony
GitHub repository.
小技巧
Take care to point your pull request towards symfony:2.3
if you want
the core team to pull a bugfix based on the 2.3
branch.
To ease the core team work, always include the modified components in your pull request message, like in:
[Yaml] fixed something
[Form] [Validator] [FrameworkBundle] added something
The pull request description must include the following checklist at the top to ensure that contributions may be reviewed without needless feedback loops and that your contributions can be included into Symfony as quickly as possible:
| Q | A
| ------------- | ---
| Bug fix? | [yes|no]
| New feature? | [yes|no]
| BC breaks? | [yes|no]
| Deprecations? | [yes|no]
| Tests pass? | [yes|no]
| Fixed tickets | [comma separated list of tickets fixed by the PR]
| License | MIT
| Doc PR | [The reference to the documentation PR if any]
An example submission could now look as follows:
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #12, #43
| License | MIT
| Doc PR | symfony/symfony-docs#123
The whole table must be included (do not remove lines that you think are not relevant). For simple typos, minor changes in the PHPDocs, or changes in translation files, use the shorter version of the check-list:
| Q | A
| ------------- | ---
| Fixed tickets | [comma separated list of tickets fixed by the PR]
| License | MIT
Some answers to the questions trigger some more requirements:
CHANGELOG
and UPGRADE
files;CHANGELOG
and UPGRADE
files;If some of the previous requirements are not met, create a todo-list and add relevant items:
- [ ] fix the tests as they have not been updated yet
- [ ] submit changes to the documentation
- [ ] document the BC breaks
If the code is not finished yet because you don’t have time to finish it or because you want early feedback on your work, add an item to todo-list:
- [ ] finish the code
- [ ] gather feedback for my changes
As long as you have items in the todo-list, please prefix the pull request title with “[WIP]”.
In the pull request description, give as much details as possible about your changes (don’t hesitate to give code examples to illustrate your points). If your pull request is about adding a new feature or modifying an existing one, explain the rationale for the changes. The pull request description helps the code review and it serves as a reference when the code is merged (the pull request description and all its associated comments are part of the merge commit message).
In addition to this “code” pull request, you must also send a pull request to the documentation repository to update the documentation when appropriate.
Based on the feedback on the pull request, you might need to rework your
patch. Before re-submitting the patch, rebase with upstream/master
or
upstream/2.3
, don’t merge; and force the push to the origin:
$ git rebase -f upstream/master
$ git push --force origin BRANCH_NAME
注解
When doing a push --force
, always specify the branch name explicitly
to avoid messing other branches in the repo (--force
tells Git that
you really want to mess with things so do it carefully).
Often, moderators will ask you to “squash” your commits. This means you will convert many commits to one commit. To do this, use the rebase command:
$ git rebase -i upstream/master
$ git push --force origin BRANCH_NAME
After you type this command, an editor will popup showing a list of commits:
pick 1a31be6 first commit
pick 7fc64b4 second commit
pick 7d33018 third commit
To squash all commits into the first one, remove the word pick
before the
second and the last commits, and replace it by the word squash
or just
s
. When you save, Git will start rebasing, and if successful, will ask
you to edit the commit message, which by default is a listing of the commit
messages of all the commits. When you are finished, execute the push command.