This commit is contained in:
336
docs/community/code_and_doc.en.md
Normal file
336
docs/community/code_and_doc.en.md
Normal file
@@ -0,0 +1,336 @@
|
||||
---
|
||||
comments: true
|
||||
typora-copy-images-to: images
|
||||
---
|
||||
|
||||
# Appendix
|
||||
|
||||
This appendix contains python, document specifications and Pull Request process.
|
||||
|
||||
## Appendix 1:Python Code Specification
|
||||
|
||||
The Python code of PaddleOCR follows [PEP8 Specification]( https://www.python.org/dev/peps/pep-0008/ ), some of the key concerns include the following
|
||||
|
||||
- Space
|
||||
|
||||
- Spaces should be added after commas, semicolons, colons, not before them
|
||||
|
||||
```python linenums="1"
|
||||
# true:
|
||||
print(x, y)
|
||||
|
||||
# false:
|
||||
print(x , y)
|
||||
```
|
||||
|
||||
- When specifying a keyword parameter or default parameter value in a function, do not use spaces on both sides of it
|
||||
|
||||
```python linenums="1"
|
||||
# true:
|
||||
def complex(real, imag=0.0)
|
||||
# false:
|
||||
def complex(real, imag = 0.0)
|
||||
```
|
||||
|
||||
- comment
|
||||
|
||||
- Inline comments: inline comments are indicated by the` # `sign. Two spaces should be left between code and` # `, and one space should be left between` # `and comments, for example
|
||||
|
||||
```python linenums="1"
|
||||
x = x + 1 # Compensate for border
|
||||
```
|
||||
|
||||
- Functions and methods: The definition of each function should include the following:
|
||||
|
||||
- Function description: Utility, input and output of function
|
||||
- Args: Name and description of each parameter
|
||||
- Returns: The meaning and type of the return value
|
||||
|
||||
```python linenums="1"
|
||||
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
|
||||
"""Fetches rows from a Bigtable.
|
||||
|
||||
Retrieves rows pertaining to the given keys from the Table instance
|
||||
represented by big_table. Silly things may happen if
|
||||
other_silly_variable is not None.
|
||||
|
||||
Args:
|
||||
big_table: An open Bigtable Table instance.
|
||||
keys: A sequence of strings representing the key of each table row
|
||||
to fetch.
|
||||
other_silly_variable: Another optional variable, that has a much
|
||||
longer name than the other args, and which does nothing.
|
||||
|
||||
Returns:
|
||||
A dict mapping keys to the corresponding table row data
|
||||
fetched. Each row is represented as a tuple of strings. For
|
||||
example:
|
||||
|
||||
{'Serak': ('Rigel VII', 'Preparer'),
|
||||
'Zim': ('Irk', 'Invader'),
|
||||
'Lrrr': ('Omicron Persei 8', 'Emperor')}
|
||||
|
||||
If a key from the keys argument is missing from the dictionary,
|
||||
then that row was not found in the table.
|
||||
"""
|
||||
pass
|
||||
```
|
||||
|
||||
## Appendix 2: Document Specification
|
||||
|
||||
### 2.1 Overall Description
|
||||
|
||||
- Document Location: If you add new features to your original Markdown file, please **Do not re-create** a new file. If you don't know where to add it, you can first PR the code and then ask the official in commit.
|
||||
|
||||
- New Markdown Document Name: Describe the content of the document in English, typically a combination of lowercase letters and underscores, such as `add_New_Algorithm.md`
|
||||
|
||||
- New Markdown Document Format: Catalog - Body - FAQ
|
||||
|
||||
> The directory generation method can use [this site](https://ecotrust-canada.github.io/markdown-toc/ ) Automatically extract directories after copying MD contents, and then add `
|
||||
|
||||
- English and Chinese: Any changes or additions to the document need to be made in both Chinese and English documents.
|
||||
|
||||
### 2.2 Format Specification
|
||||
|
||||
- Title format: The document title format follows the format of: Arabic decimal point combination-space-title (for example, `2.1 XXXX`, `2.XXXX`)
|
||||
|
||||
- Code block: Displays code in code block format that needs to be run, describing the meaning of command parameters before the code block. for example:
|
||||
|
||||
> Pipeline of detection + direction Classify + recognition: Vertical text can be recognized after set direction classifier parameters`--use_angle_cls true`.
|
||||
>
|
||||
> ```bash linenums="1"
|
||||
> paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true
|
||||
> ```
|
||||
|
||||
- Variable References: If code variables or command parameters are referenced in line, they need to be represented in line code, for example, above `--use_angle_cls true` with one space in front and one space in back
|
||||
|
||||
- Uniform naming: e.g. PP-OCRv2, PP-OCR mobile, `paddleocr` whl package, PPOCRLabel, Paddle Lite, etc.
|
||||
|
||||
- Supplementary notes: Supplementary notes by reference format `>`.
|
||||
|
||||
- Picture: If a picture is added to the description document, specify the naming of the picture (describing its content) and add the picture under `doc/`.
|
||||
|
||||
- Title: Capitalize the first letter of each word in the title.
|
||||
|
||||
## Appendix 3: Pull Request Description
|
||||
|
||||
### 3.1 PaddleOCR Branch Description
|
||||
|
||||
PaddleOCR will maintain two branches in the future, one for each:
|
||||
|
||||
- release/x.x family branch: stable release version branch, also the default branch. PaddleOCR releases a new release branch based on feature updates and adapts to the release version of Paddle. As versions iterate, more and more release/x.x family branches are maintained by default with the latest version of the release branch.
|
||||
- dygraph branch: For the development branch, adapts the dygraph version of the Paddle dynamic graph to primarily develop new functionality. If you need to redevelop, choose the dygraph branch. To ensure that the dygraph branch pulls out the release/x.x branch when needed, the code for the dygraph branch can only use the valid API in the latest release branch of Paddle. That is, if a new API has been developed in the Paddle dygraph branch but has not yet appeared in the release branch code, do not use it in Paddle OCR. In addition, performance optimization, parameter tuning, policy updates that do not involve API can be developed normally.
|
||||
|
||||
The historical branch of PaddleOCR will no longer be maintained in the future. These branches will continue to be maintained, considering that some of you may still be using them:
|
||||
|
||||
Develop branch: This branch was used for the development and testing of static diagrams and is currently compatible with version >=1.7. If you have special needs, you can also use this branch to accommodate older versions of Paddle, but you won't update your code until you fix the bug.
|
||||
|
||||
PaddleOCR welcomes you to actively contribute code to repo. Here are some basic processes for contributing code.
|
||||
|
||||
### 3.2 PaddleOCR Code Submission Process And Specification
|
||||
|
||||
If you are familiar with Git use, you can jump directly to [Some Conventions For Submitting Code in 3.2.10](#Some_conventions_for_submitting_code)
|
||||
|
||||
#### 3.2.1 Create Your `Remote Repo`
|
||||
|
||||
In PaddleOCR [GitHub Home]( https://github.com/PaddlePaddle/PaddleOCR ) Click the `Fork` button in the upper left corner to create a `remote repo`in your personal directory, such as `https://github.com/ {your_name}/PaddleOCR`.
|
||||
|
||||

|
||||
|
||||
Clone `Remote repo`
|
||||
|
||||
```bash linenums="1"
|
||||
# pull code of develop branch
|
||||
git clone https://github.com/{your_name}/PaddleOCR.git -b dygraph
|
||||
cd PaddleOCR
|
||||
```
|
||||
|
||||
Clone failures are mostly due to network reasons, try again later or configure the proxy
|
||||
|
||||
#### 3.2.2 Login And Connect Using Token
|
||||
|
||||
Start by viewing the information for the current `remote repo`.
|
||||
|
||||
```bash linenums="1"
|
||||
git remote -v
|
||||
# origin https://github.com/{your_name}/PaddleOCR.git (fetch)
|
||||
# origin https://github.com/{your_name}/PaddleOCR.git (push)
|
||||
```
|
||||
|
||||
Only the information of the clone `remote repo`, i.e. the PaddleOCR under your username, is available. Due to the change in Github's login method, you need to reconfigure the `remote repo` address by means of a Token. The token is generated as follows:
|
||||
|
||||
1. Find Personal Access Tokens: Click on your avatar in the upper right corner of the Github page and choose Settings --> Developer settings --> Personal access tokens,
|
||||
|
||||
2. Click Generate new token: Fill in the token name in Note, such as 'paddle'. In Select scopes, select repo (required), admin:repo_hook, delete_repo, etc. You can check them according to your needs. Then click Generate token to generate the token, and finally copy the generated token.
|
||||
|
||||
Delete the original origin configuration
|
||||
|
||||
```bash linenums="1"
|
||||
git remote rm origin
|
||||
```
|
||||
|
||||
Change the remote branch to `https://oauth2:{token}@github.com/{your_name}/PaddleOCR.git`. For example, if the token value is 12345 and your user name is PPOCR, run the following command
|
||||
|
||||
```bash linenums="1"
|
||||
git remote add origin https://oauth2:12345@github.com/PPOCR/PaddleOCR.git
|
||||
```
|
||||
|
||||
This establishes a connection to our own `remote repo`. Next we create a remote host of the original PaddleOCR repo, named upstream.
|
||||
|
||||
```bash linenums="1"
|
||||
git remote add upstream https://github.com/PaddlePaddle/PaddleOCR.git
|
||||
```
|
||||
|
||||
Use `git remote -v` to view current `remote warehouse` information, output as follows, found to include two origin and two upstream of `remote repo` .
|
||||
|
||||
```bash linenums="1"
|
||||
origin https://github.com/{your_name}/PaddleOCR.git (fetch)
|
||||
origin https://github.com/{your_name}/PaddleOCR.git (push)
|
||||
upstream https://github.com/PaddlePaddle/PaddleOCR.git (fetch)
|
||||
upstream https://github.com/PaddlePaddle/PaddleOCR.git (push)
|
||||
```
|
||||
|
||||
This is mainly to keep the local repository up to date when subsequent pull request (PR) submissions are made.
|
||||
|
||||
#### 3.2.3 Create Local Branch
|
||||
|
||||
First get the latest code of upstream, then create a new_branch branch based on the dygraph of the upstream repo (upstream).
|
||||
|
||||
```bash linenums="1"
|
||||
git fetch upstream
|
||||
git checkout -b new_branch upstream/dygraph
|
||||
```
|
||||
|
||||
> If for a newly forked PaddleOCR project, the user's remote repo (origin) has the same branch updates as the upstream repository (upstream), you can also create a new local branch based on the default branch of the origin repo or a specified branch with the following command
|
||||
>
|
||||
> ```bash linenums="1"
|
||||
> # Create new_branch branch on user remote repo (origin) based on develop branch
|
||||
> git checkout -b new_branch origin/develop
|
||||
> # Create new_branch branch based on upstream remote repo develop branch
|
||||
> # If you need to create a new branch from upstream,
|
||||
> # you need to first use git fetch upstream to get upstream code
|
||||
> git checkout -b new_branch upstream/develop
|
||||
> ```
|
||||
|
||||
The final switch to the new branch is displayed with the following output information.
|
||||
|
||||
Branch new_branch set up to track remote branch develop from upstream.
|
||||
Switched to a new branch 'new_branch'
|
||||
|
||||
After switching branches, file changes can be made on this branch
|
||||
|
||||
#### 3.2.4 Use Pre-Commit Hook
|
||||
|
||||
Paddle developers use the pre-commit tool to manage Git pre-submit hooks. It helps us format the source code (C++, Python) and automatically check for basic things (such as having only one EOL per file, not adding large files to Git) before committing it.
|
||||
|
||||
The pre-commit test is part of the unit test in Travis-CI. PR that does not satisfy the hook cannot be submitted to PaddleOCR. Install it first and run it in the current directory:
|
||||
|
||||
```bash linenums="1"
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
> 1. Paddle uses clang-format to adjust the C/C++ source code format. Make sure the `clang-format` version is above 3.8.
|
||||
>
|
||||
> 2. Yapf installed through pip install pre-commit is slightly different from conda install-c conda-forge pre-commit, and PaddleOCR developers use `pip install pre-commit`.
|
||||
|
||||
#### 3.2.5 Modify And Submit Code
|
||||
|
||||
If you make some changes on `README.Md` on PaddleOCR, you can view the changed file through `git status`, and then add the changed file using `git add`。
|
||||
|
||||
```bash linenums="1"
|
||||
git status # View change files
|
||||
git add README.md
|
||||
pre-commit
|
||||
```
|
||||
|
||||
Repeat these steps until the pre-comit format check does not error. As shown below.
|
||||
|
||||

|
||||
|
||||
Use the following command to complete the submission.
|
||||
|
||||
```bash linenums="1"
|
||||
git commit -m "your commit info"
|
||||
```
|
||||
|
||||
#### 3.2.6 Keep Local Repo Up To Date
|
||||
|
||||
Get the latest code for upstream and update the current branch. Here the upstream comes from section 2.2, `Connecting to a remote repo`.
|
||||
|
||||
```bash linenums="1"
|
||||
git fetch upstream
|
||||
# If you want to commit to another branch, you need to pull code from another branch of upstream, here is develop
|
||||
git pull upstream develop
|
||||
```
|
||||
|
||||
#### 3.2.7 Push To Remote Repo
|
||||
|
||||
```bash linenums="1"
|
||||
git push origin new_branch
|
||||
```
|
||||
|
||||
#### 3.2.7 Submit Pull Request
|
||||
|
||||
Click the new pull request to select the local branch and the target branch, as shown in the following figure. In the description of PR, fill in the functions completed by the PR. Next, wait for review, and if you need to modify something, update the corresponding branch in origin with the steps above.
|
||||
|
||||

|
||||
|
||||
#### 3.2.8 Sign CLA Agreement And Pass Unit Tests
|
||||
|
||||
Signing the CLA When submitting a Pull Request to PaddlePaddle for the first time, you need to sign a CLA (Contributor License Agreement) agreement to ensure that your code can be incorporated as follows:
|
||||
|
||||
1. Please check the Check section in PR, find the license/cla, and click on the right detail to enter the CLA website
|
||||
|
||||
2. Click Sign in with GitHub to agree on the CLA website and when clicked, it will jump back to your Pull Request page
|
||||
|
||||
#### 3.2.9 Delete Branch
|
||||
|
||||
- Remove remote branch
|
||||
|
||||
After PR is merged into the main repo, we can delete the branch of the remote repofrom the PR page.
|
||||
You can also use `git push origin:branch name` to delete remote branches, such as:
|
||||
|
||||
```bash linenums="1"
|
||||
git push origin :new_branch
|
||||
```
|
||||
|
||||
- Delete local branch
|
||||
|
||||
```bash linenums="1"
|
||||
# Switch to the development branch, otherwise the current branch cannot be deleted
|
||||
git checkout develop
|
||||
|
||||
# Delete new_ Branch Branch
|
||||
git branch -D new_branch
|
||||
```
|
||||
|
||||
#### 3.2.10 Some Conventions For Submitting Code
|
||||
|
||||
In order for official maintainers to better focus on the code itself when reviewing it, please follow the following conventions each time you submit your code:
|
||||
|
||||
1)Please ensure that the unit tests in Travis-CI pass smoothly. If not, indicate that there is a problem with the submitted code, and the official maintainer generally does not review it.
|
||||
|
||||
2)Before submitting a Pull Request.
|
||||
|
||||
- Note the number of commits.
|
||||
|
||||
Reason: If you only modify one file and submit more than a dozen commits, each commit will only make a few modifications, which can be very confusing to the reviewer. The reviewer needs to look at each commit individually to see what changes have been made, and does not exclude the fact that changes between commits overlap each other.
|
||||
|
||||
Suggestion: Keep as few commits as possible each time you submit, and supplement your last commit with git commit --amend. For multiple commits that have been Push to a remote warehouse, you can refer to [squash commits after push](https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed ).
|
||||
|
||||
- Note the name of each commit: it should reflect the content of the current commit, not be too arbitrary.
|
||||
|
||||
3) If you have solved a problem, add in the first comment box of the Pull Request:fix #issue_number,This will automatically close the corresponding Issue when the Pull Request is merged. Key words include:close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved,please choose the right vocabulary. Detailed reference [Closing issues via commit messages](https://help.github.com/articles/closing-issues-via-commit-messages).
|
||||
|
||||
In addition, in response to the reviewer's comments, you are requested to abide by the following conventions:
|
||||
|
||||
1) Each review comment from an official maintainer would like a response, which would better enhance the contribution of the open source community.
|
||||
|
||||
- If you agree to the review opinion and modify it accordingly, give a simple Done.
|
||||
- If you disagree with the review, please give your own reasons for refuting.
|
||||
|
||||
2)If there are many reviews:
|
||||
|
||||
- Please give an overview of the changes.
|
||||
- Please reply with `start a review', not directly. The reason is that each reply sends an e-mail message, which can cause a mail disaster.
|
||||
327
docs/community/code_and_doc.md
Normal file
327
docs/community/code_and_doc.md
Normal file
@@ -0,0 +1,327 @@
|
||||
---
|
||||
comments: true
|
||||
typora-copy-images-to: images
|
||||
---
|
||||
|
||||
# 附录
|
||||
|
||||
本附录包含了Python、文档规范以及Pull Request流程,请各位开发者遵循相关内容
|
||||
|
||||
## 附录1:Python代码规范
|
||||
|
||||
PaddleOCR的Python代码遵循 [PEP8规范](https://www.python.org/dev/peps/pep-0008/),其中一些关注的重点包括如下内容
|
||||
|
||||
- 空格
|
||||
|
||||
- 空格应该加在逗号、分号、冒号后,而非他们的前面
|
||||
|
||||
```python linenums="1"
|
||||
# 正确:
|
||||
print(x, y)
|
||||
|
||||
# 错误:
|
||||
print(x , y)
|
||||
```
|
||||
|
||||
- 在函数中指定关键字参数或默认参数值时, 不要在其两侧使用空格
|
||||
|
||||
```python linenums="1"
|
||||
# 正确:
|
||||
def complex(real, imag=0.0)
|
||||
# 错误:
|
||||
def complex(real, imag = 0.0)
|
||||
```
|
||||
|
||||
- 注释
|
||||
|
||||
- 行内注释:行内注释使用 `#` 号表示,在代码与 `#` 之间需要空两个空格, `#` 与注释之间应当空一个空格,例如
|
||||
|
||||
```python linenums="1"
|
||||
x = x + 1 # Compensate for border
|
||||
```
|
||||
|
||||
- 函数和方法:每个函数的定义后的描述应该包括以下内容:
|
||||
|
||||
- 函数描述:函数的作用,输入输出的
|
||||
- Args:每个参数的名字以及对该参数的描述
|
||||
- Returns:返回值的含义和类型
|
||||
|
||||
```python linenums="1"
|
||||
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
|
||||
"""Fetches rows from a Bigtable.
|
||||
|
||||
Retrieves rows pertaining to the given keys from the Table instance
|
||||
represented by big_table. Silly things may happen if
|
||||
other_silly_variable is not None.
|
||||
|
||||
Args:
|
||||
big_table: An open Bigtable Table instance.
|
||||
keys: A sequence of strings representing the key of each table row
|
||||
to fetch.
|
||||
other_silly_variable: Another optional variable, that has a much
|
||||
longer name than the other args, and which does nothing.
|
||||
|
||||
Returns:
|
||||
A dict mapping keys to the corresponding table row data
|
||||
fetched. Each row is represented as a tuple of strings. For
|
||||
example:
|
||||
|
||||
{'Serak': ('Rigel VII', 'Preparer'),
|
||||
'Zim': ('Irk', 'Invader'),
|
||||
'Lrrr': ('Omicron Persei 8', 'Emperor')}
|
||||
|
||||
If a key from the keys argument is missing from the dictionary,
|
||||
then that row was not found in the table.
|
||||
"""
|
||||
pass
|
||||
```
|
||||
|
||||
## 附录2:文档规范
|
||||
|
||||
### 2.1 总体说明
|
||||
|
||||
- 文档位置:如果您增加的新功能可以补充在原有的Markdown文件中,请**不要重新新建**一个文件。如果您对添加的位置不清楚,可以先PR代码,然后在commit中询问官方人员。
|
||||
|
||||
- 新增Markdown文档名称:使用英文描述文档内容,一般由小写字母与下划线组合而成,例如 `add_new_algorithm.md`
|
||||
|
||||
- 新增Markdown文档格式:目录 - 正文 - FAQ
|
||||
|
||||
> 目录生成方法可以使用 [此网站](https://ecotrust-canada.github.io/markdown-toc/) 将md内容复制之后自动提取目录,然后在md文件的每个标题前添加
|
||||
|
||||
- 中英双语:任何对文档的改动或新增都需要分别在中文和英文文档上进行。
|
||||
|
||||
### 2.2 格式规范
|
||||
|
||||
- 标题格式:文档标题格式按照:阿拉伯数字小数点组合 - 空格 - 标题的格式(例如 `2.1 XXXX` , `2. XXXX`)
|
||||
|
||||
- 代码块:通过代码块格式展示需要运行的代码,在代码块前描述命令参数的含义。例如:
|
||||
|
||||
> 检测+方向分类器+识别全流程:设置方向分类器参数 `--use_angle_cls true` 后可对竖排文本进行识别。
|
||||
>
|
||||
> ```bash linenums="1"
|
||||
> paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true
|
||||
> ```
|
||||
|
||||
- 变量引用:如果在行内引用到代码变量或命令参数,需要用行内代码表示,例如上方 `--use_angle_cls true` ,并在前后各空一格
|
||||
|
||||
- 统一命名:如PP-OCRv2、PP-OCR mobile、`paddleocr` whl包、PPOCRLabel、Paddle Lite等
|
||||
|
||||
- 补充说明:通过引用格式 `>` 补充说明,或对注意事项进行说明
|
||||
|
||||
- 图片:如果在说明文档中增加了图片,请规范图片的命名形式(描述图片内容),并将图片添加在 `doc/` 下
|
||||
|
||||
## 附录3:Pull Request说明
|
||||
|
||||
### 3.1 PaddleOCR分支说明
|
||||
|
||||
PaddleOCR未来将维护2种分支,分别为:
|
||||
|
||||
- release/x.x系列分支:为稳定的发行版本分支,也是默认分支。PaddleOCR会根据功能更新情况发布新的release分支,同时适配Paddle的release版本。随着版本迭代,release/x.x系列分支会越来越多,默认维护最新版本的release分支。
|
||||
- dygraph分支:为开发分支,适配Paddle动态图的dygraph版本,主要用于开发新功能。如果有同学需要进行二次开发,请选择dygraph分支。为了保证dygraph分支能在需要的时候拉出release/x.x分支,dygraph分支的代码只能使用Paddle最新release分支中有效的api。也就是说,如果Paddle dygraph分支中开发了新的api,但尚未出现在release分支代码中,那么请不要在PaddleOCR中使用。除此之外,对于不涉及api的性能优化、参数调整、策略更新等,都可以正常进行开发。
|
||||
|
||||
PaddleOCR的历史分支,未来将不再维护。考虑到一些同学可能仍在使用,这些分支还会继续保留:
|
||||
|
||||
- develop分支:这个分支曾用于静态图的开发与测试,目前兼容>=1.7版本的Paddle。如果有特殊需求,要适配旧版本的Paddle,那还可以使用这个分支,但除了修复bug外不再更新代码。
|
||||
|
||||
PaddleOCR欢迎大家向repo中积极贡献代码,下面给出一些贡献代码的基本流程。
|
||||
|
||||
### 3.2 PaddleOCR代码提交流程与规范
|
||||
|
||||
> 如果你熟悉Git使用,可以直接跳转到 [3.2.10 提交代码的一些约定](#提交代码的一些约定)
|
||||
|
||||
#### 3.2.1 创建你的 `远程仓库`
|
||||
|
||||
- 在PaddleOCR的 [GitHub首页](https://github.com/PaddlePaddle/PaddleOCR),点击左上角 `Fork` 按钮,在你的个人目录下创建 `远程仓库`,比如`https://github.com/{your_name}/PaddleOCR`。
|
||||
|
||||

|
||||
|
||||
- 将 `远程仓库` Clone到本地
|
||||
|
||||
```bash linenums="1"
|
||||
# 拉取dygraph分支的代码
|
||||
git clone https://github.com/{your_name}/PaddleOCR.git -b dygraph
|
||||
cd PaddleOCR
|
||||
```
|
||||
|
||||
> 多数情况下clone失败是由于网络原因,请稍后重试或配置代理
|
||||
|
||||
#### 3.2.2 通过Token方式登录与建立连接
|
||||
|
||||
首先查看当前 `远程仓库` 的信息。
|
||||
|
||||
```bash linenums="1"
|
||||
git remote -v
|
||||
# origin https://github.com/{your_name}/PaddleOCR.git (fetch)
|
||||
# origin https://github.com/{your_name}/PaddleOCR.git (push)
|
||||
```
|
||||
|
||||
只有clone的 `远程仓库` 的信息,也就是自己用户名下的 PaddleOCR。由于Github的登录方式变化,需要通过Token的方式重新配置 `远程仓库` 的地址。生成Token的方式如下:
|
||||
|
||||
1. 找到个人访问令牌(token):在Github页面右上角点击自己的头像,然后依次选择 Settings --> Developer settings --> Personal access tokens
|
||||
2. 点击 Generate new token:在Note中填入token名称,例如’paddle‘。在Select scopes选择repo(必选)、admin:repo_hook、delete_repo等,可根据自身需要勾选。然后点击Generate token生成token。最后复制生成的token。
|
||||
|
||||
删除原始的origin配置
|
||||
|
||||
```bash linenums="1"
|
||||
git remote rm origin
|
||||
```
|
||||
|
||||
将remote分支改成 `https://oauth2:{token}@github.com/{your_name}/PaddleOCR.git`。例如:如果token值为12345,你的用户名为PPOCR,则运行下方命令
|
||||
|
||||
```bash linenums="1"
|
||||
git remote add origin https://oauth2:12345@github.com/PPOCR/PaddleOCR.git
|
||||
```
|
||||
|
||||
这样我们就与自己的 `远程仓库` 建立了连接。接下来我们创建一个原始 PaddleOCR 仓库的远程主机,命名为 upstream。
|
||||
|
||||
```bash linenums="1"
|
||||
git remote add upstream https://github.com/PaddlePaddle/PaddleOCR.git
|
||||
```
|
||||
|
||||
使用 `git remote -v` 查看当前 `远程仓库` 的信息,输出如下,发现包括了origin和upstream 2个 `远程仓库` 。
|
||||
|
||||
```bash linenums="1"
|
||||
origin https://oauth2:{token}@github.com/{your_name}/PaddleOCR.git (fetch)
|
||||
origin https://oauth2:{token}@github.com/{your_name}/PaddleOCR.git (push)
|
||||
upstream https://github.com/PaddlePaddle/PaddleOCR.git (fetch)
|
||||
upstream https://github.com/PaddlePaddle/PaddleOCR.git (push)
|
||||
```
|
||||
|
||||
这主要是为了后续在提交pull request(PR)时,始终保持本地仓库最新。
|
||||
|
||||
#### 3.2.3 创建本地分支
|
||||
|
||||
首先获取 upstream 的最新代码,然后基于上游仓库 (upstream)的dygraph创建new_branch分支。
|
||||
|
||||
```bash linenums="1"
|
||||
git fetch upstream
|
||||
git checkout -b new_branch upstream/dygraph
|
||||
```
|
||||
|
||||
> 如果对于新Fork的PaddleOCR项目,用户远程仓库(origin)与上游(upstream)仓库的分支更新情况相同,也可以基于origin仓库的默认分支或指定分支创建新的本地分支,命令如下。
|
||||
>
|
||||
> ```bash linenums="1"
|
||||
> # 基于用户远程仓库(origin)的dygraph创建new_branch分支
|
||||
> git checkout -b new_branch origin/dygraph
|
||||
>
|
||||
> # 基于用户远程仓库(origin)的默认分支创建new_branch分支
|
||||
> git checkout -b new_branch
|
||||
> ```
|
||||
|
||||
最终会显示切换到新的分支,输出信息如下
|
||||
|
||||
```bash linenums="1"
|
||||
Branch new_branch set up to track remote branch develop from upstream.
|
||||
Switched to a new branch 'new_branch'
|
||||
```
|
||||
|
||||
切换分支之后即可在此分支上进行文件改动
|
||||
|
||||
#### 3.2.4 使用pre-commit勾子
|
||||
|
||||
Paddle 开发人员使用 pre-commit 工具来管理 Git 预提交钩子。 它可以帮助我们格式化源代码(C++,Python),在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。
|
||||
|
||||
pre-commit测试是 Travis-CI 中单元测试的一部分,不满足钩子的 PR 不能被提交到 PaddleOCR,首先安装并在当前目录运行它:
|
||||
|
||||
```bash linenums="1"
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
> 1. Paddle 使用 clang-format 来调整 C/C++ 源代码格式,请确保 `clang-format` 版本在 3.8 以上。
|
||||
>
|
||||
> 2. 通过pip install pre-commit和conda install -c conda-forge pre-commit安装的yapf稍有不同的,PaddleOCR 开发人员使用的是 `pip install pre-commit`。
|
||||
|
||||
#### 3.2.5 修改与提交代码
|
||||
|
||||
假设对PaddleOCR的 `README.md` 做了一些修改,可以通过 `git status` 查看改动的文件,然后使用 `git add` 添加改动文件。
|
||||
|
||||
```bash linenums="1"
|
||||
git status # 查看改动文件
|
||||
git add README.md
|
||||
pre-commit
|
||||
```
|
||||
|
||||
重复上述步骤,直到pre-comit格式检查不报错。如下所示。
|
||||
|
||||

|
||||
|
||||
提交修改,并写明修改内容("your commit info")
|
||||
|
||||
```bash linenums="1"
|
||||
git commit -m "your commit info"
|
||||
```
|
||||
|
||||
#### 3.2.6 Push到远程仓库
|
||||
|
||||
使用push命令将修改的commit提交到 `远程仓库`
|
||||
|
||||
```bash linenums="1"
|
||||
git push origin new_branch
|
||||
```
|
||||
|
||||
#### 3.2.7 提交Pull Request
|
||||
|
||||
打开自己的远程仓库界面,选择提交的分支。点击new pull request或contribute进入PR界面。选择本地分支和目标分支,如下图所示。在PR的描述说明中,填写该PR所完成的功能。接下来等待review,如果有需要修改的地方,参照上述步骤更新 origin 中的对应分支即可。
|
||||
|
||||

|
||||
|
||||
#### 3.2.8 签署CLA协议和通过单元测试
|
||||
|
||||
- 签署CLA 在首次向PaddlePaddle提交Pull Request时,您需要您签署一次CLA(Contributor License Agreement)协议,以保证您的代码可以被合入,具体签署方式如下:
|
||||
|
||||
1. 请您查看PR中的Check部分,找到license/cla,并点击右侧detail,进入CLA网站
|
||||
|
||||
2. 点击CLA网站中的“Sign in with GitHub to agree”,点击完成后将会跳转回您的Pull Request页面
|
||||
|
||||
#### 3.2.9 删除分支
|
||||
|
||||
- 删除远程分支
|
||||
|
||||
在 PR 被 merge 进主仓库后,我们可以在 PR 的页面删除远程仓库的分支。
|
||||
|
||||
也可以使用 `git push origin :分支名` 删除远程分支,如:
|
||||
|
||||
```bash linenums="1"
|
||||
git push origin :new_branch
|
||||
```
|
||||
|
||||
- 删除本地分支
|
||||
|
||||
```bash linenums="1"
|
||||
# 切换到dygraph分支,否则无法删除当前分支
|
||||
git checkout dygraph
|
||||
|
||||
# 删除new_branch分支
|
||||
git branch -D new_branch
|
||||
```
|
||||
|
||||
#### 3.2.10 提交代码的一些约定
|
||||
|
||||
为了使官方维护人员在评审代码时更好地专注于代码本身,请您每次提交代码时,遵守以下约定:
|
||||
|
||||
1)请保证Travis-CI 中单元测试能顺利通过。如果没过,说明提交的代码存在问题,官方维护人员一般不做评审。
|
||||
|
||||
2)提交Pull Request前:
|
||||
|
||||
- 请注意commit的数量。
|
||||
|
||||
原因:如果仅仅修改一个文件但提交了十几个commit,每个commit只做了少量的修改,这会给评审人带来很大困扰。评审人需要逐一查看每个commit才能知道做了哪些修改,且不排除commit之间的修改存在相互覆盖的情况。
|
||||
|
||||
建议:每次提交时,保持尽量少的commit,可以通过git commit --amend补充上次的commit。对已经Push到远程仓库的多个commit,可以参考[squash commits after push](https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed)。
|
||||
|
||||
- 请注意每个commit的名称:应能反映当前commit的内容,不能太随意。
|
||||
|
||||
3)如果解决了某个Issue的问题,请在该Pull Request的第一个评论框中加上:fix #issue_number,这样当该Pull Request被合并后,会自动关闭对应的Issue。关键词包括:close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved,请选择合适的词汇。详细可参考[Closing issues via commit messages](https://help.github.com/articles/closing-issues-via-commit-messages)。
|
||||
|
||||
此外,在回复评审人意见时,请您遵守以下约定:
|
||||
|
||||
1)官方维护人员的每一个review意见都希望得到回复,这样会更好地提升开源社区的贡献。
|
||||
|
||||
- 对评审意见同意且按其修改完的,给个简单的Done即可;
|
||||
- 对评审意见不同意的,请给出您自己的反驳理由。
|
||||
|
||||
2)如果评审意见比较多:
|
||||
|
||||
- 请给出总体的修改情况。
|
||||
- 请采用`start a review`进行回复,而非直接回复的方式。原因是每个回复都会发送一封邮件,会造成邮件灾难。
|
||||
116
docs/community/community_contribution.md
Normal file
116
docs/community/community_contribution.md
Normal file
@@ -0,0 +1,116 @@
|
||||
---
|
||||
comments: true
|
||||
typora-copy-images-to: images
|
||||
---
|
||||
|
||||
# 社区贡献
|
||||
|
||||
感谢大家长久以来对PaddleOCR的支持和关注,与广大开发者共同构建一个专业、和谐、相互帮助的开源社区是PaddleOCR的目标。本文档展示了已有的社区贡献、对于各类贡献说明、新的机会与流程,希望贡献流程更加高效、路径更加清晰。
|
||||
|
||||
PaddleOCR希望可以通过AI的力量助力任何一位有梦想的开发者实现自己的想法,享受创造价值带来的愉悦。
|
||||
|
||||
<a href="https://github.com/PaddlePaddle/PaddleOCR/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=PaddlePaddle/PaddleOCR&max=400&columns=20" />
|
||||
</a>
|
||||
|
||||
---
|
||||
|
||||
## 1. 社区贡献
|
||||
|
||||
### 1.1 基于PaddleOCR的社区项目
|
||||
|
||||
| 类别 | 项目 | 描述 | 开发者 |
|
||||
| -------- | ------ | ------ | --------- |
|
||||
| 通用工具 | [FastOCRLabel](https://gitee.com/BaoJianQiang/FastOCRLabel) | 完整的C#版本标注GUI | [包建强](https://gitee.com/BaoJianQiang) |
|
||||
| 通用工具 | [DangoOCR离线版](https://github.com/PantsuDango/DangoOCR) | 通用型桌面级即时翻译GUI | [PantsuDango](https://github.com/PantsuDango) |
|
||||
| 通用工具 | [scr2txt](https://github.com/lstwzd/scr2txt) | 截屏转文字GUI | [lstwzd](https://github.com/lstwzd) |
|
||||
| 通用工具 | [ocr_sdk](https://github.com/mymagicpower/AIAS/blob/main/1_image_sdks/text_recognition/ocr_sdk) | OCR java SDK工具箱 | [Calvin](https://github.com/mymagicpower) |
|
||||
| 通用工具 | [iocr](https://github.com/mymagicpower/AIAS/blob/main/8_suite_hub/iocr) | IOCR 自定义模板识别(支持表格识别) | [Calvin](https://github.com/mymagicpower) |
|
||||
| 通用工具 | [Lmdb Dataset Format Conversion Tool](https://github.com/OneYearIsEnough/PaddleOCR-Recog-LmdbDataset-Conversion) | 文本识别任务中lmdb数据格式转换工具 | [OneYearIsEnough](https://github.com/OneYearIsEnough) |
|
||||
| 通用工具 | [用paddleocr打造一款“盗幕笔记”](https://github.com/kjf4096/paddleocr_dmbj) | 用PaddleOCR记笔记 | [kjf4096](https://github.com/kjf4096) |
|
||||
| 垂类工具 | [AI Studio项目](https://aistudio.baidu.com/aistudio/projectdetail/1054614?channelType=0&channel=0) | 英文视频自动生成字幕 | [叶月水狐](https://aistudio.baidu.com/aistudio/personalcenter/thirdview/322052) |
|
||||
| 垂类工具 | [id_card_ocr](https://github.com/baseli/id_card_ocr) | 身份证复印件识别 | [baseli](https://github.com/baseli) |
|
||||
| 垂类工具 | [Paddle_Table_Image_Reader](https://github.com/thunder95/Paddle_Table_Image_Reader) | 能看懂表格图片的数据助手 | [thunder95](https://github.com/thunder95]) |
|
||||
| 垂类工具 | [AI Studio项目](https://aistudio.baidu.com/aistudio/projectdetail/3382897) | OCR流程中对手写体进行过滤 | [daassh](https://github.com/daassh) |
|
||||
| 垂类场景调优 | [AI Studio项目](https://aistudio.baidu.com/aistudio/projectdetail/2803693) | 电表读数和编号识别 | [深渊上的坑](https://github.com/edencfc) |
|
||||
| 垂类场景调优 | [AI Studio项目](https://aistudio.baidu.com/aistudio/projectdetail/3284199) | LCD液晶字符检测 | [Dream拒杰](https://github.com/zhangyingying520) |
|
||||
| 前后处理 | [paddleOCRCorrectOutputs](https://github.com/yuranusduke/paddleOCRCorrectOutputs) | 获取OCR识别结果的key-value | [yuranusduke](https://github.com/yuranusduke) |
|
||||
|前处理| [optlab](https://github.com/GreatV/optlab) |OCR前处理工具箱,基于Qt和Leptonica。|[GreatV](https://github.com/GreatV)|
|
||||
|应用部署| [PaddleOCRSharp](https://github.com/raoyutian/PaddleOCRSharp) |PaddleOCR的.NET封装与应用部署。|[raoyutian](https://github.com/raoyutian/PaddleOCRSharp)|
|
||||
|应用部署| [PaddleSharp](https://github.com/sdcb/PaddleSharp) |PaddleOCR的.NET封装与应用部署,支持跨平台、GPU|[sdcb](https://github.com/sdcb)|
|
||||
| 应用部署 | [PaddleOCR-Streamlit-Demo](https://github.com/Lovely-Pig/PaddleOCR-Streamlit-Demo) | 使用Streamlit部署PaddleOCR | [Lovely-Pig](https://github.com/Lovely-Pig) |
|
||||
| 应用部署 | [PaddleOCR-PyWebIO-Demo](https://github.com/Lovely-Pig/PaddleOCR-PyWebIO-Demo) | 使用PyWebIO部署PaddleOCR | [Lovely-Pig](https://github.com/Lovely-Pig) |
|
||||
| 应用部署 | [PaddleOCR-Paddlejs-Vue-Demo](https://github.com/Lovely-Pig/PaddleOCR-Paddlejs-Vue-Demo) | 使用Paddle.js和Vue部署PaddleOCR | [Lovely-Pig](https://github.com/Lovely-Pig) |
|
||||
| 应用部署 | [PaddleOCR-Paddlejs-React-Demo](https://github.com/Lovely-Pig/PaddleOCR-Paddlejs-React-Demo) | 使用Paddle.js和React部署PaddleOCR | [Lovely-Pig](https://github.com/Lovely-Pig) |
|
||||
| 学术前沿模型训练与推理 | [AI Studio项目](https://aistudio.baidu.com/aistudio/projectdetail/3397137) | StarNet-MobileNetV3算法–中文训练 | [xiaoyangyang2](https://github.com/xiaoyangyang2) |
|
||||
| 学术前沿模型训练与推理 | [ABINet-paddle](https://github.com/Huntersdeng/abinet-paddle) | ABINet算法前向运算的paddle实现以及模型各部分的实现细节分析 | [Huntersdeng](https://github.com/Huntersdeng) |
|
||||
|
||||
### 1.2 为PaddleOCR新增功能
|
||||
|
||||
- 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android([#340](https://github.com/PaddlePaddle/PaddleOCR/pull/340))和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码([#325](https://github.com/PaddlePaddle/PaddleOCR/pull/325))
|
||||
- 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务([#507](https://github.com/PaddlePaddle/PaddleOCR/pull/507))。
|
||||
- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用([#1027](https://github.com/PaddlePaddle/PaddleOCR/pull/1027))。
|
||||
- 非常感谢 [Evezerest](https://github.com/Evezerest), [ninetailskim](https://github.com/ninetailskim), [edencfc](https://github.com/edencfc), [BeyondYourself](https://github.com/BeyondYourself), [1084667371](https://github.com/1084667371) 贡献了[PPOCRLabel](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/PPOCRLabel/README_ch.md) 的完整代码。
|
||||
- 非常感谢 [bupt906](https://github.com/bupt906) 贡献MicroNet结构代码([#5251](https://github.com/PaddlePaddle/PaddleOCR/pull/5251))和贡献OneCycle学习率策略代码([#5252](https://github.com/PaddlePaddle/PaddleOCR/pull/5252))
|
||||
|
||||
### 1.3 代码修复
|
||||
|
||||
- 非常感谢 [zhangxin](https://github.com/ZhangXinNan)([Blog](https://blog.csdn.net/sdlypyzq)) 贡献新的可视化方式、添加.gitgnore、处理手动设置PYTHONPATH环境变量的问题([#210](https://github.com/PaddlePaddle/PaddleOCR/pull/210))。
|
||||
- 非常感谢 [lyl120117](https://github.com/lyl120117) 贡献打印网络结构的代码([#304](https://github.com/PaddlePaddle/PaddleOCR/pull/304))。
|
||||
- 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格([so many commits)](https://github.com/PaddlePaddle/PaddleOCR/commits?author=BeyondYourself)。
|
||||
|
||||
### 1.4 文档优化与翻译
|
||||
|
||||
- 非常感谢 **[RangeKing](https://github.com/RangeKing),[HustBestCat](https://github.com/HustBestCat),[v3fc](https://github.com/v3fc),[1084667371](https://github.com/1084667371)** 贡献翻译《动手学OCR》notebook[电子书英文版](https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/notebook/notebook_en)。
|
||||
- 非常感谢 [thunderstudying](https://github.com/thunderstudying),[RangeKing](https://github.com/RangeKing),[livingbody](https://github.com/livingbody), [WZMIAOMIAO](https://github.com/WZMIAOMIAO),[haigang1975](https://github.com/haigang1975) 补充多个英文markdown文档。
|
||||
- 非常感谢 **[fanruinet](https://github.com/fanruinet)** 润色和修复35篇英文文档([#5205](https://github.com/PaddlePaddle/PaddleOCR/pull/5205))。
|
||||
- 非常感谢 [Khanh Tran](https://github.com/xxxpsyduck) 和 [Karl Horky](https://github.com/karlhorky) 贡献修改英文文档。
|
||||
|
||||
### 1.5 多语言语料
|
||||
|
||||
- 非常感谢 [xiangyubo](https://github.com/xiangyubo) 贡献手写中文OCR数据集([#321](https://github.com/PaddlePaddle/PaddleOCR/pull/321))。
|
||||
- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料([#954](https://github.com/PaddlePaddle/PaddleOCR/pull/954))。
|
||||
|
||||
## 2. 贡献说明
|
||||
|
||||
### 2.1 新增功能类
|
||||
|
||||
PaddleOCR非常欢迎社区贡献以PaddleOCR为核心的各种服务、部署实例与软件应用,经过认证的社区贡献会被添加在上述社区贡献表中,为广大开发者增加曝光,也是PaddleOCR的荣耀,其中:
|
||||
|
||||
- 项目形式:官方社区认证的项目代码应有良好的规范和结构,同时,还应配备一个详细的README.md,说明项目的使用方法。通过在requirements.txt文件中增加一行 `paddleocr` 可以自动收录到PaddleOCR的usedby中。
|
||||
|
||||
- 合入方式:如果是对PaddleOCR现有工具的更新升级,则会合入主repo。如果为PaddleOCR拓展了新功能,请先与官方人员联系,确认项目是否合入主repo,*即使新功能未合入主repo,我们同样也会以社区贡献的方式为您的个人项目增加曝光。*
|
||||
|
||||
### 2.2 代码优化
|
||||
|
||||
如果您在使用PaddleOCR时遇到了代码bug、功能不符合预期等问题,可以为PaddleOCR贡献您的修改,其中:
|
||||
|
||||
- Python代码规范可参考[附录1:Python代码规范](./code_and_doc.md#附录1python代码规范)。
|
||||
|
||||
- 提交代码前请再三确认不会引入新的bug,并在PR中描述优化点。如果该PR解决了某个issue,请在PR中连接到该issue。所有的PR都应该遵守附录3中的[3.2.10 提交代码的一些约定。](./code_and_doc.md#附录3pull-request说明)
|
||||
|
||||
- 请在提交之前参考下方的[附录3:Pull Request说明](./code_and_doc.md#附录3pull-request说明)。如果您对git的提交流程不熟悉,同样可以参考附录3的3.2节。
|
||||
|
||||
### 2.3 文档优化
|
||||
|
||||
如果您在使用PaddleOCR时遇到了文档表述不清楚、描述缺失、链接失效等问题,可以为PaddleOCR贡献您的修改。文档书写规范请参考[附录2:文档规范](./code_and_doc.md#附录2文档规范)。
|
||||
|
||||
## 3. 更多贡献机会
|
||||
|
||||
我们非常鼓励开发者使用PaddleOCR实现自己的想法,同时我们也列出一些经过分析后认为有价值的拓展方向,整体收集在社区项目常规赛中。
|
||||
|
||||
## 4. 联系我们
|
||||
|
||||
我们非常欢迎广大开发者在有意向为PaddleOCR贡献代码、文档、语料等内容前与我们联系,这样可以大大降低PR过程中的沟通成本。同时,如果您觉得某些想法个人难以实现,我们也可以通过SIG的形式定向为项目招募志同道合的开发者一起共建。通过SIG渠道贡献的项目将会获得深层次的研发支持与运营资源(如公众号宣传、直播课等)。
|
||||
|
||||
我们推荐的贡献流程是:
|
||||
|
||||
- 通过在github issue的题目中增加 `【third-party】` 标记,说明遇到的问题(以及解决的思路)或想拓展的功能,等待值班人员回复。例如 `【third-party】为PaddleOCR贡献IOS示例`
|
||||
- 与我们沟通确认技术方案或bug、优化点准确无误后进行功能新增或相应的修改,代码与文档遵循相关规范。
|
||||
- PR链接到上述issue,等待review。
|
||||
|
||||
## 5. 致谢与后续
|
||||
|
||||
- 合入代码之后会在本文档第一节中更新信息,默认链接为github名字及主页,如果有需要更换主页,也可以联系我们。
|
||||
- 新增重要功能类,会在用户群广而告之,享受开源社区荣誉时刻。
|
||||
- **如果您有基于PaddleOCR的项目,但未出现在上述列表中,请按照 `4. 联系我们` 的步骤与我们联系。**
|
||||
BIN
docs/community/images/banner.png
Normal file
BIN
docs/community/images/banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
BIN
docs/community/images/pr.png
Normal file
BIN
docs/community/images/pr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 538 KiB |
BIN
docs/community/images/precommit_pass.png
Normal file
BIN
docs/community/images/precommit_pass.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
Reference in New Issue
Block a user