{"id":21888554,"url":"https://github.com/pythoncat1024/git_file_mode_ignore","last_synced_at":"2026-04-11T00:00:13.588Z","repository":{"id":107255453,"uuid":"99138091","full_name":"pythoncat1024/git_file_mode_ignore","owner":"pythoncat1024","description":"通过python脚本对多个git仓库进行文件mode忽略对批处理","archived":false,"fork":false,"pushed_at":"2017-08-05T15:40:48.000Z","size":26,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-26T20:32:18.232Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pythoncat1024.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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":"2017-08-02T16:23:15.000Z","updated_at":"2022-11-23T08:29:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"040a6bc3-e92d-40c9-b0b6-78ad4e76a0ec","html_url":"https://github.com/pythoncat1024/git_file_mode_ignore","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2Fgit_file_mode_ignore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2Fgit_file_mode_ignore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2Fgit_file_mode_ignore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2Fgit_file_mode_ignore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythoncat1024","download_url":"https://codeload.github.com/pythoncat1024/git_file_mode_ignore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244895527,"owners_count":20527902,"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":[],"created_at":"2024-11-28T11:15:57.172Z","updated_at":"2026-04-11T00:00:13.443Z","avatar_url":"https://github.com/pythoncat1024.png","language":"Python","readme":"# git_file_mode_ignore\n通过python脚本对多个git仓库进行文件mode忽略对批处理\n\n* (背景)[http://blog.csdn.net/ducklikejava/article/details/76600869]\n\n* 正文：\n\n** git镇楼：`git config --global core.filemode false`**\n\n* **如何利用`python`执行`bash`脚本？**\n* **如何像`cd xxx/`一样任性跳转目录执行`bash`命令？**\n\n**这两个问题解决了，才算是解决了使用`python`脚本执行`bash`命令的全部痛点。**\n\n一一解答：\n\u003e 1. 如何利用`python`执行`bash`脚本？\n* `os.popen(bash_comand)`即可\n\u003e 2. 如何像`cd xxx/`一样任性跳转目录执行`bash`命令？\n* `os.chdir(path)`就如同`cd xxx/`一般，可以任性地切换到任意目录\n\n于是，就有了如下代码   ：\n   \n```\n#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# @name   : find_t.py\n# @author : cat\n# @date   : 2017/8/2.\n\nimport os\nimport time\n\ndef bash_shell(bash_command):\n    \"\"\"\n    python 中执行 bash 命令\n    :param bash_command:\n    :return: bash 命令执行后的控制台输出\n    \"\"\"\n    try:\n        return os.popen(bash_command).read().strip()\n    except:\n        return None\n\n\ndef find_target(target_path=\"./../\", key='.git'):\n    \"\"\"\n    查找目标目录所在的目录 ： 如 ／aa/bb/.git --\u003e return /aa/bb/\n    :param target_path:\n    :param key: target\n    :return:\n    \"\"\"\n    walk = os.walk(target_path)\n    for super_dir, dir_names, file_names in walk:\n        for dir_name in dir_names:\n            if dir_name == key:\n                dir_full_path = os.path.join(super_dir, dir_name)\n                # print(dir_full_path, super_dir, dir_name, sep=\" ## \")\n                yield super_dir\n\n\nif __name__ == '__main__':\n    print(\"start execute bash ...........\")\n    st = time.time()\n    cwd = os.getcwd()\n    # this for repo\n    for repo_path in find_target(os.getcwd(), key='.repo'):\n        os.chdir(repo_path)\n        if repo_path == os.getcwd():\n            print('find repo in --\u003e', repo_path)\n            print(bash_shell('pwd'))\n            print(bash_shell('repo forall -c git config core.fileMode false\t--replace-all'))\n\n        else:\n            print('error in chdir 2 {}'.format(repo_path))\n        if os.getcwd() != cwd:\n            os.chdir(cwd)\n        if os.getcwd() != cwd:\n            print('change 2 cwd FAIL !!!  {}'.format(cwd))\n\n    # this for git\n    for git_path in find_target(os.getcwd(), key='.git'):\n        os.chdir(git_path)\n        if git_path == os.getcwd():\n            print('find git in --\u003e', git_path)\n            print(bash_shell('pwd'))\n            print(bash_shell('git config --global core.filemode false'))\n        else:\n            print('error in chdir 2 {}'.format(git_path))\n        if os.getcwd() != cwd:\n            os.chdir(cwd)\n        if os.getcwd() != cwd:\n            print('change 2 cwd FAIL !!!  {}'.format(cwd))\n\n    et = time.time()\n    print('\\n\\n    #### execute finished in {:.3f} seconds ####'.format(et - st))\n    print('\\n')\n    # test for bash_command\n    # print(bash_shell('git init'))\n    # print(bash_shell('ls -al'))\n\n```\n\n于是，执行之后的输出如下：\n\n```python\n\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6/frameworks/base\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6/packages/apps/Email\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6/packages/apps/Music\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6/packages/apps/Settings\nbash_command = pwd\n/Users/cat/Desktop/testGit/a6/vender/customer\nspend time : 0.096 seconds\nend  ####################  end\n\nProcess finished with exit code 0\n\n```\n\n通过输出可以看到，所有的`.repo`以及`.git`目录所在目录是已经找出来了。然后执行`bash_commad(command)`即可在仓库目录执行`git / repo`命令了。\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoncat1024%2Fgit_file_mode_ignore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpythoncat1024%2Fgit_file_mode_ignore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoncat1024%2Fgit_file_mode_ignore/lists"}