# gwalk



gwalk 一个用于管理批量 Git 仓库的命令行工具集,帮助开发者对大批量的 Git 仓库进行日常维护。
## ✨ 特性
- 🔍 列出指定目录下的 Git 仓库(可选递归)
- 🎯 支持按状态过滤(modified/untracked/dirty/clean)
- 📋 支持黑/白名单过滤
- 🚀 支持批量执行命令
- 🔄 集成常用 Git 操作的小工具
## 📦 安装
### 通过 pip 安装
```bash
python -m pip install pygwalk
```
### 从源码安装
```bash
git clone https://github.com/ZeroKwok/gwalk.git
cd gwalk
python -m pip install .
```
## 🔨 命令行工具
### gl - Git Fetch & Pull
快速执行 fetch 和 pull 操作:
```bash
# 拉取所有远程仓库并合并到当前分支
gl
# 使用 rebase 模式拉取
gl --rebase
# 仅执行 pull (跳过 fetch)
gl -q
```
### gcp - Git Commit & Push
快速提交并推送更改:
```bash
# 提交修改并推送到所有远程仓库, 等价于
# git add -u && git commit -m "your commit message" && git push
gcp "your commit message"
# 仅推送当前分支到所有远程仓库
gcp -p
```
### gwalk - 仓库批处理工具
用于批量管理 Git 仓库:
```bash
# 列出当前目录下的所有 dirty 仓库
gwalk
# 递归列出当前目录下的所有仓库
gwalk -rf all
# 在所有列出的仓库中执行 git fetch && git pull
gwalk -rf all -a run gl
```
### gapply - 补丁应用工具
应用补丁并创建提交(dry-run 模式):
```bash
gapply -n patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch
```
输出如下:
```bash
Patch: patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch
- subject : Add cache and Settings management capabilities, supportfor environment detection
- newfiles:
- src/shared/store/cache.js
- src/shared/store/preset.js
- src/shared/store/settings.js
- src/shared/utils/env.js
(dry-run) > git apply -v "patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch"
(dry-run) > git add -u
(dry-run) > git add "src/shared/store/cache.js"
(dry-run) > git add "src/shared/store/preset.js"
(dry-run) > git add "src/shared/store/settings.js"
(dry-run) > git add "src/shared/utils/env.js"
(dry-run) > git commit -m "Add cache and Settings management capabilities, supportfor environment detection"
```
## 📝 使用示例
```bash
# 在所有 gwalk 列出的仓库中, 执行 gl 工具(git pull)
gwalk -rf all -a run gl
# 在所有 gwalk 列出的仓库中, 执行 git push 操作 {ab} 表示 当前分支(ActiveBranch)
gwalk -rf all -a run git push second {ab}
# 批量手动处理(交互模式)
# 在列出的所有 '包含未提交的修改' 的仓库中, 启动一个 bash shell 来接受用户的操作
gwalk -rf modified --a bash
# 批量推送
# 在列出的所有 '包含未提交的修改 且 不再黑名单中' 的仓库中, 运行 gcp 工具, 推送当前分支到所有远程仓库
gwalk -rf modified --blacklist gwalk.blacklist --a "gcp -p"
# 批量打标签
# 在列出的所有 白名单 gwalk.whitelist 匹配的仓库中, 运行 git tag v1.5.0
gwalk -rf all --whitelist gwalk.whitelist -a run git tag v1.5.0
# 批量查看目录下所有仓库的最近3次提交
gwalk -f all -l none -a run "git log --oneline -n3"
# 批量替换 origin 远程仓库的地址, 从 github.com 替换成 gitee.com
# 在所有 gwalk 列出的仓库中, 执行自定义命令
gwalk -rf all -a run git remote set-url origin `echo \`git remote get-url origin\` | python -c "print(input().replace('github.com', 'gitee.com'))"`
```
## 📄 协议
本项目基于 MIT 协议开源 - 详见 [LICENSE](LICENSE) 文件
Raw data
{
"_id": null,
"home_page": null,
"name": "pygwalk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "git, tools",
"author": null,
"author_email": "Zero Kwok <zero.kwok@foxmail.com>",
"download_url": "https://files.pythonhosted.org/packages/f2/2b/7e8415a83bf4ebd7dc3cb559f9cd6cb1ed4f6d1ffb02833e2ddc078f79b5/pygwalk-0.2.4.tar.gz",
"platform": null,
"description": "# gwalk\n\n\n\n\n\ngwalk \u4e00\u4e2a\u7528\u4e8e\u7ba1\u7406\u6279\u91cf Git \u4ed3\u5e93\u7684\u547d\u4ee4\u884c\u5de5\u5177\u96c6\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u5bf9\u5927\u6279\u91cf\u7684 Git \u4ed3\u5e93\u8fdb\u884c\u65e5\u5e38\u7ef4\u62a4\u3002\n\n## \u2728 \u7279\u6027\n\n- \ud83d\udd0d \u5217\u51fa\u6307\u5b9a\u76ee\u5f55\u4e0b\u7684 Git \u4ed3\u5e93(\u53ef\u9009\u9012\u5f52)\n- \ud83c\udfaf \u652f\u6301\u6309\u72b6\u6001\u8fc7\u6ee4(modified/untracked/dirty/clean)\n- \ud83d\udccb \u652f\u6301\u9ed1/\u767d\u540d\u5355\u8fc7\u6ee4\n- \ud83d\ude80 \u652f\u6301\u6279\u91cf\u6267\u884c\u547d\u4ee4\n- \ud83d\udd04 \u96c6\u6210\u5e38\u7528 Git \u64cd\u4f5c\u7684\u5c0f\u5de5\u5177\n\n## \ud83d\udce6 \u5b89\u88c5\n\n### \u901a\u8fc7 pip \u5b89\u88c5\n\n```bash\npython -m pip install pygwalk\n```\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n\n```bash\ngit clone https://github.com/ZeroKwok/gwalk.git\ncd gwalk\npython -m pip install .\n```\n\n## \ud83d\udd28 \u547d\u4ee4\u884c\u5de5\u5177\n\n### gl - Git Fetch & Pull\n\n\u5feb\u901f\u6267\u884c fetch \u548c pull \u64cd\u4f5c:\n\n```bash\n# \u62c9\u53d6\u6240\u6709\u8fdc\u7a0b\u4ed3\u5e93\u5e76\u5408\u5e76\u5230\u5f53\u524d\u5206\u652f\ngl\n\n# \u4f7f\u7528 rebase \u6a21\u5f0f\u62c9\u53d6\ngl --rebase\n\n# \u4ec5\u6267\u884c pull (\u8df3\u8fc7 fetch)\ngl -q\n```\n\n### gcp - Git Commit & Push\n\n\u5feb\u901f\u63d0\u4ea4\u5e76\u63a8\u9001\u66f4\u6539:\n\n```bash\n# \u63d0\u4ea4\u4fee\u6539\u5e76\u63a8\u9001\u5230\u6240\u6709\u8fdc\u7a0b\u4ed3\u5e93, \u7b49\u4ef7\u4e8e\n# git add -u && git commit -m \"your commit message\" && git push\ngcp \"your commit message\"\n\n# \u4ec5\u63a8\u9001\u5f53\u524d\u5206\u652f\u5230\u6240\u6709\u8fdc\u7a0b\u4ed3\u5e93\ngcp -p\n```\n\n### gwalk - \u4ed3\u5e93\u6279\u5904\u7406\u5de5\u5177\n\n\u7528\u4e8e\u6279\u91cf\u7ba1\u7406 Git \u4ed3\u5e93:\n\n```bash\n# \u5217\u51fa\u5f53\u524d\u76ee\u5f55\u4e0b\u7684\u6240\u6709 dirty \u4ed3\u5e93\ngwalk\n\n# \u9012\u5f52\u5217\u51fa\u5f53\u524d\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u4ed3\u5e93\ngwalk -rf all\n\n# \u5728\u6240\u6709\u5217\u51fa\u7684\u4ed3\u5e93\u4e2d\u6267\u884c git fetch && git pull\ngwalk -rf all -a run gl\n```\n\n### gapply - \u8865\u4e01\u5e94\u7528\u5de5\u5177\n\n\u5e94\u7528\u8865\u4e01\u5e76\u521b\u5efa\u63d0\u4ea4(dry-run \u6a21\u5f0f):\n\n```bash\ngapply -n patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch \n```\n\n\u8f93\u51fa\u5982\u4e0b:\n\n```bash\nPatch: patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch\n - subject : Add cache and Settings management capabilities, supportfor environment detection\n - newfiles: \n - src/shared/store/cache.js\n - src/shared/store/preset.js\n - src/shared/store/settings.js\n - src/shared/utils/env.js\n(dry-run) > git apply -v \"patchs/0008-Add-cache-and-Settings-management-capabilities-suppo.patch\"\n(dry-run) > git add -u\n(dry-run) > git add \"src/shared/store/cache.js\"\n(dry-run) > git add \"src/shared/store/preset.js\"\n(dry-run) > git add \"src/shared/store/settings.js\"\n(dry-run) > git add \"src/shared/utils/env.js\"\n(dry-run) > git commit -m \"Add cache and Settings management capabilities, supportfor environment detection\"\n```\n\n## \ud83d\udcdd \u4f7f\u7528\u793a\u4f8b\n\n```bash\n# \u5728\u6240\u6709 gwalk \u5217\u51fa\u7684\u4ed3\u5e93\u4e2d, \u6267\u884c gl \u5de5\u5177(git pull)\ngwalk -rf all -a run gl\n\n# \u5728\u6240\u6709 gwalk \u5217\u51fa\u7684\u4ed3\u5e93\u4e2d, \u6267\u884c git push \u64cd\u4f5c {ab} \u8868\u793a \u5f53\u524d\u5206\u652f(ActiveBranch)\ngwalk -rf all -a run git push second {ab}\n\n# \u6279\u91cf\u624b\u52a8\u5904\u7406(\u4ea4\u4e92\u6a21\u5f0f)\n# \u5728\u5217\u51fa\u7684\u6240\u6709 '\u5305\u542b\u672a\u63d0\u4ea4\u7684\u4fee\u6539' \u7684\u4ed3\u5e93\u4e2d, \u542f\u52a8\u4e00\u4e2a bash shell \u6765\u63a5\u53d7\u7528\u6237\u7684\u64cd\u4f5c\ngwalk -rf modified --a bash\n\n# \u6279\u91cf\u63a8\u9001\n# \u5728\u5217\u51fa\u7684\u6240\u6709 '\u5305\u542b\u672a\u63d0\u4ea4\u7684\u4fee\u6539 \u4e14 \u4e0d\u518d\u9ed1\u540d\u5355\u4e2d' \u7684\u4ed3\u5e93\u4e2d, \u8fd0\u884c gcp \u5de5\u5177, \u63a8\u9001\u5f53\u524d\u5206\u652f\u5230\u6240\u6709\u8fdc\u7a0b\u4ed3\u5e93\ngwalk -rf modified --blacklist gwalk.blacklist --a \"gcp -p\"\n\n# \u6279\u91cf\u6253\u6807\u7b7e\n# \u5728\u5217\u51fa\u7684\u6240\u6709 \u767d\u540d\u5355 gwalk.whitelist \u5339\u914d\u7684\u4ed3\u5e93\u4e2d, \u8fd0\u884c git tag v1.5.0\ngwalk -rf all --whitelist gwalk.whitelist -a run git tag v1.5.0\n\n# \u6279\u91cf\u67e5\u770b\u76ee\u5f55\u4e0b\u6240\u6709\u4ed3\u5e93\u7684\u6700\u8fd13\u6b21\u63d0\u4ea4\ngwalk -f all -l none -a run \"git log --oneline -n3\"\n\n# \u6279\u91cf\u66ff\u6362 origin \u8fdc\u7a0b\u4ed3\u5e93\u7684\u5730\u5740, \u4ece github.com \u66ff\u6362\u6210 gitee.com\n# \u5728\u6240\u6709 gwalk \u5217\u51fa\u7684\u4ed3\u5e93\u4e2d, \u6267\u884c\u81ea\u5b9a\u4e49\u547d\u4ee4\ngwalk -rf all -a run git remote set-url origin `echo \\`git remote get-url origin\\` | python -c \"print(input().replace('github.com', 'gitee.com'))\"`\n```\n\n## \ud83d\udcc4 \u534f\u8bae\n\n\u672c\u9879\u76ee\u57fa\u4e8e MIT \u534f\u8bae\u5f00\u6e90 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "gwalk \u662f\u4e00\u7cfb\u5217\u7528\u4e8e\u7ba1\u7406 Git \u4ed3\u5e93\u7684\u547d\u4ee4\u884c\u5c0f\u5de5\u5177\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u5bf9\u5927\u6279\u91cf\u7684 Git \u4ed3\u5e93\u8fdb\u884c\u65e5\u5e38\u7ef4\u62a4\u3002",
"version": "0.2.4",
"project_urls": {
"Homepage": "https://github.com/ZeroKwok/gwalk",
"Issues": "https://github.com/ZeroKwok/gwalk/issues"
},
"split_keywords": [
"git",
" tools"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "cd2921356726cbca6a372ccd5a766540dfa61ba90941dd76840e8e9eebd4938c",
"md5": "dd9a4436f65fdeee50c0f21101df7e6e",
"sha256": "cdd4caaa15179cfde015f83563baddcc996a2dc4e9c5d2121b985b5d8efbe0fa"
},
"downloads": -1,
"filename": "pygwalk-0.2.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dd9a4436f65fdeee50c0f21101df7e6e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 17463,
"upload_time": "2025-07-14T03:09:25",
"upload_time_iso_8601": "2025-07-14T03:09:25.576792Z",
"url": "https://files.pythonhosted.org/packages/cd/29/21356726cbca6a372ccd5a766540dfa61ba90941dd76840e8e9eebd4938c/pygwalk-0.2.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f22b7e8415a83bf4ebd7dc3cb559f9cd6cb1ed4f6d1ffb02833e2ddc078f79b5",
"md5": "2a3810e51d8b03fc373bf1192d61088c",
"sha256": "28ffc2b872dd735108bf3a1c5ef16c728af090201ce0d57a250f6c77c0cbd37f"
},
"downloads": -1,
"filename": "pygwalk-0.2.4.tar.gz",
"has_sig": false,
"md5_digest": "2a3810e51d8b03fc373bf1192d61088c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 16268,
"upload_time": "2025-07-14T03:09:26",
"upload_time_iso_8601": "2025-07-14T03:09:26.856215Z",
"url": "https://files.pythonhosted.org/packages/f2/2b/7e8415a83bf4ebd7dc3cb559f9cd6cb1ed4f6d1ffb02833e2ddc078f79b5/pygwalk-0.2.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-14 03:09:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ZeroKwok",
"github_project": "gwalk",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "termcolor",
"specs": []
},
{
"name": "GitPython",
"specs": []
}
],
"lcname": "pygwalk"
}