{"id":15958887,"url":"https://github.com/xinetzone/projects","last_synced_at":"2025-10-15T00:32:47.027Z","repository":{"id":130621692,"uuid":"185902760","full_name":"xinetzone/projects","owner":"xinetzone","description":"一个项目的通用模板（python）","archived":false,"fork":false,"pushed_at":"2019-09-22T15:31:19.000Z","size":102,"stargazers_count":5,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-09T21:11:16.162Z","etag":null,"topics":["projects"],"latest_commit_sha":null,"homepage":"https://xinetzone.github.io/projects/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xinetzone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-10T02:15:00.000Z","updated_at":"2023-04-12T02:44:29.000Z","dependencies_parsed_at":"2023-03-30T10:36:30.382Z","dependency_job_id":null,"html_url":"https://github.com/xinetzone/projects","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xinetzone%2Fprojects","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xinetzone%2Fprojects/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xinetzone%2Fprojects/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xinetzone%2Fprojects/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xinetzone","download_url":"https://codeload.github.com/xinetzone/projects/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247166144,"owners_count":20894652,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["projects"],"created_at":"2024-10-07T14:21:05.715Z","updated_at":"2025-10-15T00:32:41.991Z","avatar_url":"https://github.com/xinetzone.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# 项目配置管理\n\n项目配置管理（Project Configuration Management）简称 PCM，为了更加方便管理项目，需要对每个项目进行统一规范。\n\n使用的项目管理工具是 [Git](https://git-scm.com/downloads) 与 [vscode](https://code.visualstudio.com/) 进行搭配。\n\n下面将介绍如何创建一个项目？\n\n## 1 项目初始化\n\n- 目标：使用 Python 创建一个计算机视觉库（命名为 cvsome）\n\n打开 vscode 并在终端输入：\n\n```sh\n$ git clone git@github.com:xinetzone/projects.git cvsome\n$ cd cvsome\n```\n\n因为打算使用 Python 完成该项目，所以需要将 [demo.gitignore/python.gitignore](demo.gitignore/python.gitignore) 复制到 [.gitignore](.gitignore)，过滤到 Python 代码编译的中间文件。\n\n将改动提交到 Git 仓库：\n\n```sh\n$ git add .\n$ git commit -m  \"修改 gitignore\"\n```\n\n进行项目初始化操作：\n\n```sh\n$ mkdir data draft models outputs app notebook\n```\n\n关于 `data`，`draft`，`models`，`outputs`，`app`，`notebook` 的介绍参考 [initial](initial.md)。\n\n为了更加快捷的管理项目，需要借助 Git 的扩展包 Git Flow：\n\n```sh\n$ git flow init\n```\n\n一路回车下去即可。至此，完成项目的初始化工作。\n\n## 2 Git Flow 规则\n\n接下来以实例介绍 Git Flow 的规则，方便后期使用。简单来说, Git Flow 将 branch 分成 2 个主要分支（master、develop）和 3 个临时的辅助分支（feature、release、hotfix）。\n\n分支|简介\n:-:|:-\nmaster|永远处在即将发布(production-ready)状态\ndevelop|最新的开发状态\nfeature|开发新功能的分支，基于 develop，完成后 merge 回 develop\nrelease|准备要发布版本的分支，用来修复 bug. 基于 develop，完成后 merge 回 develop 和 master\nhotfix|修复 master 上的问题，等不及 release 版本就必须马上上线. 基于 master，完成后 merge 回 master 和 develop\n\n### 2.1 场景1：开发新功能\n\n应用场景：需要开发一个用于爬取百度图片的 API\n\n使用 Git Flow 开始创建项目的一个新功能 spide：\n\n```sh\n$ git flow feature start spide\n```\n这个操作创建了一个基于'develop'的特性分支 `feature/spide`，并切换到这个分支之下。\n\n下面在 `app/` 目录下创建 `spide` 用于存放代码：\n\n```sh\n$ touch app/__init__.py\n$ mkdir app/spide\n$ touch app/spide/__init__.py\n```\n\n参考 [Python 3 多线程下载百度图片搜索结果](http://lovenight.github.io/2015/11/15/Python-3-多线程下载百度图片搜索结果/) 完成代码的开发工作。\n\n代码早期开发可以放在 `draft` 中做测试，因为此时代码将不会被 Git 跟踪。待调试好代码将其放在 `app/spide/` 下面。这里编写了 `baiduimages.py` 用于下载给定一个关键字，如“猫”，便会从百度图片中下载与猫相关的图片。\n\n将这些改动添加到 Git 管理中：\n\n```sh\n$ git add .\n$ git commit -m \"编写了 `baiduimages.py` 用于下载给定一个关键字，如“猫”，便会从百度图片中下载与猫相关的图片。\"\n```\n\n新功能的开发已经完成，可以提交：\n\n```sh\n$ git flow feature finish spide\n```\n\n该操作完成以下工作：feature/spide 分支的代码会被合并到 develop 里面，然后删除该分支并切换回 develop。现在 master 分支要滞后于 develop 分支，需要将 develop 分支合并到 master 分支中：\n\n```sh\n$ git checkout master\n```\n\n\n\n此时项目的状态除去最初的 git@github.com:xinetzone/projects.git，仅仅可以供个人使用和开发。\n\n### 2.2 Git 创建裸库\n\n对于一个公司，项目便是金钱，我们不想将项目放到类似 GitHub 这种托管网站进行托管，而想要将项目放在公司内部的局域网内进行开发。基于此场景，需要舍弃源库 git@github.com:xinetzone/projects.git，重新创建一个裸库（类似于服务器）用于公司内部的开发。首先需要切换目录到 cvsome 项目之外：\n\n```sh\n$ cd ..\n```\n\n接着，执行如下命令创建一个名字为 `cvsome.git` 的裸库：\n\n```sh\n$ git clone --bare cvsome/ cvsome.git\n```\n\n此时的 `cvsome.git` 便是我们需要的服务器了。\n\n只要在同一个局域网，便可以通过 `git clone` 克隆副本，现先考虑在同一台电脑的不同目录进行克隆：\n\n```sh\n$ git clone cvsome.git/ test/cvsome\n```\n\n这里 `test/cvsome` 是当前目录下的 `test` 目录存放项目于 `cvsome/`，也可以是决对路径，如 `D:/work/cvsome` 等。切换到克隆的新项目之下：\n\n```sh\n$ cd test/cvsome/\n```\n\n查看现在拥有的 branch：\n\n```sh\n$ git branch -a\n```\n\n显示终端：\n\n![](images/1.png)\n\n从上图可以看到，拥有 3 个分支：一个本地分支 master 与两个远程分支 `remotes/origin/develop` 和 `remotes/origin/master`，且远程分支的 HEAD 指针指向 `origin/master`。\n\n因为是新克隆的项目，需要对项目进行初始化：\n\n```sh\n$ mkdir data draft models outputs notebook\n$ git flow init\n```\n\n考虑到项目的可读性，需要使用 Markdown 记录项目的细节，而说明项目细节时不免涉及到使用图片进行说明，我们还需要创建 `images` 目录用于存放图片：\n\n```sh\n$ mkdir images\n```\n\n### 2.3 场景2：发布上线，版本代号 0.0.1\n\n应用场景：代码调试的差不多了，需要发布到线上（比如，公司内部的资源配置部门）。 允许修正小问题，并为发布版本准备元数据。使用 `git flow release start RELEASE [BASE]` 命令完成发布版本的创建（其中 `[BASE]` 参数，即 'develop' 分支下的提交记录的 sha-1 hash 值，通过 sha-1 hash 来开启动 release 分支），当前，直接基于最新的提交记录来创建发布版本：\n\n```sh\n$ git flow release start v0.0.1\n```\n\n该操作完成了如下工作：\n\n- 基于 develop 创建分支 `release/v0.0.1`\n- 切换到分支 `release/v0.0.1`\n\n查看此时所有分支，终端图示：\n\n![](images/2.png)\n\n可以看到在本地多了一个分支 `release/v0.0.1`，而你不想一个人开发此版本，需要将其提交到服务器：\n\n```sh\n$ git flow release publish v0.0.1\n```\n\n查看此时所有分支，终端图示可以看到多出分支 `remotes/origin/release/v0.0.1`：\n\n![](images/3.png)\n\n我们将 `cvsome.git` 放在 `D:/server/cvsome.git` 位置，现又有一人加入到发布版本的开发中，首先从 `cvsome.git` 中克隆一个副本：\n\n```sh\n$ git clone D:/server/cvsome.git \n$ cd cvsome/ \n$ mkdir data draft models outputs notebook | git flow init\n```\n\n查看此时所有分支，终端图示：\n\n![](images/4.png)\n\n从上图可以看出此人的本地分支没有 `release/v0.0.1`，那么该如何协助开发 `release/v0.0.1` 呢？这个很简单，Git Flow 提供了追踪：\n\n```sh\n$ git flow release track v0.0.1\n```\n对于版本号我们要求格式为：`x.y.z`，其中，`x` 用于有重大重构时才会升级，`y` 用于有新的特性发布时才会升级，`z` 用于修改了某个 bug 后才会升级。针对每个微服务，我们都需要严格按照以上开发模式来执行。\n\n查看此时所有分支，终端图示：\n\n![](images/5.png)\n\n从上图可以看出此人的本地分支存在 `release/v0.0.1`，那么便可以协助开发了。当有修改，提交到本地仓库后，需要将其推送到远端：\n\n```sh\n$ git add . | git commit -m 'U'\n$ git push origin release/v0.0.1\n```\n\n而需要更新的一端，只需要执行如下命令即可：\n\n```sh\n$ git pull origin release/v0.0.1\n```\n\n当完成发布版本的工作时需要：\n\n```sh\n$ git flow release finish v0.0.1 -m \"发布 v0.0.1\"\n```\n\n该操作完成如下工作：\n\n- 归并 release 分支到 'master' 分支并用 release 分支名打 Tag\n- 归并 release 分支到 'develop' 并移除 release 分支与远端分支 `remotes/origin/release/v0.0.1`\n- 切换到 'develop' 分支\n\n查看此时所有分支，终端图示：\n\n![](images/6.png)\n\n### 2.4 场景3：生产环境的版本处于一个不预期状态，需要立即修正\n\n应用场景：有可能是需要修正 master 分支上某个 TAG 标记的生产版本\n\n使用的命令是 `git flow hotfix start VERSION [BASENAME]`，其中 `VERSION` 参数标记着修正版本。你可以从 `[BASENAME]` 开始，`[BASENAME]` 为 `finish release` 时填写的版本号。\n\n当完成紧急修复分支，代码归并回 develop 和 master 分支。相应地，master 分支打上修正版本的 TAG。（`git flow hotfix finish VERSION`）\n\n注意：feature 与 hotfix 也都有 `publish`，`track` 具体的作用与 release 相类似。\n\n参考资料：[git-flow 备忘清单](http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html)\n\n### 2.5 总结\n\n针对一个项目的创建，需要先从 `git@github.com:xinetzone/projects.git` 克隆一个项目的模板，然后依据需求修改项目的 `.gitignore` 用于忽视代码产生的中间文件。可以将模型的训练或者测试数据放在项目的任意位置的 `data/` 目录下，这样 Git 将会忽略掉。考虑到可读性并便于 Git 进行管理最好使用 Markdown 撰写项目的说明文档。项目的代码要放置在 `app/` 目录下。依据 2.1~2.4 选择对应的策略。多人协作时通过裸库建立联系，使用 `push` 与 `pull` 进行更新。在同一个局域网的不同电脑进行通信需要使用如下格式：\n\n```sh\n$ git clone lxw@192.168.20.57:/home/lxw/utils/sdk.git\n```\n\n其中 `@` 之前的 `lxw` 指代目标主机电脑的用户名，`192.168.20.57` 目标主机电脑的 IP 地址，`/home/lxw/utils/sdk.git` 指代裸库所在的绝对路径。\n\n如果在 git clone 时不想克隆 master 分支，可以这样：\n\n```sh\n$ git clone -b 指定的远程分支名 GitHub-URL\n```\n\n用于克隆指定的分支。当很多 tag 分支版本的代码，我想克隆下载指定版本到我服务器上面，可以这样：\n\n```sh\n$ git clone --branch [tags标签] [git地址] # 或者 git clone -b [tags标签] [git地址]\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxinetzone%2Fprojects","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxinetzone%2Fprojects","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxinetzone%2Fprojects/lists"}