如何使用Gitpython从Git克隆特定分支

时间:2017-04-20 13:23:41

标签: python git gitpython

我尝试使用python函数中的GitPython从git克隆存储库。 我使用GitPython库从我的python函数中的git克隆,我的代码片段如下:

  

来自git import Repo

     

Repo.clone_from(' http://user:password@github.com/user/project.git&#39 ;,   /家庭/胃窦/项目/&#39)

它从master分支克隆。如何从其他分支克隆使用GitPython或任何其他库可以从各个分支克隆?请告诉我。

我通过使用

在命令行中提到分支来了解克隆

git clone -b branch http://github.com/user/project.git

4 个答案:

答案 0 :(得分:10)

只需传递分支名称参数,例如: -

repo = Repo.clone_from(
    'http://user:password@github.com/user/project.git',
    '/home/antro/Project/',
    branch='master'
)

请参阅here for more info

答案 1 :(得分:0)

从toanant的答案。

这对我有用-single-branch 选项

commit 471d4d60dc21fbccb8c6b4616a00238c245f78f6 Author: Gilles Sadowski <gilles@harfang.homelinux.org> Date: Mon Oct 28 01:51:42 2019 +0100 MATH-1500 (unit tests). src/test/ ... linalg/FieldLUDecompositionTest.java commit 9988a5b3c4779eadfad9ea0c4925f5b327317814 Author: Gilles Sadowski <gilles@harfang.homelinux.org> Date: Sun Oct 27 15:11:56 2019 +0100 Code upgraded following MATH-1500. src/main/... nonstiff/AdamsNordsieckTransformer.java

答案 2 :(得分:0)

对于 --single-branch 选项,您只需将 single_branch 参数传递给 Repo.clone_from() 方法:

Repo.clone_from(repo, path, single_branch=True, b='branch')

答案 3 :(得分:0)

GitPython 在幕后使用关键字 args 转换:

# cmd.py
def transform_kwarg(self, name: str, value: Any, split_single_char_options: bool) -> List[str]:
    if len(name) == 1:
        if value is True:
            return ["-%s" % name]
        elif value not in (False, None):
            if split_single_char_options:
                return ["-%s" % name, "%s" % value]
            else:
                return ["-%s%s" % (name, value)]
    else:
        if value is True:
            return ["--%s" % dashify(name)]
        elif value is not False and value is not None:
            return ["--%s=%s" % (dashify(name), value)]
    return []

生成的命令部分列表被送入 subprocess.Popen,因此您不想想要将 --single-branch 添加到存储库 URL。如果你这样做,一个奇怪的列表将传递给 Popen。例如:

['-v', '--branch=my-branch', 'https://github.com/me/my-project.git --single-branch', '/tmp/clone/here']

但是,有了这些新信息,您可以通过使用 git 传递任何 kwargs CLI flags。然后,您可能会问自己,“我如何将破折号传递给像 single-branch 这样的关键字?”这在 Python 中是行不通的。您将在上述代码中看到一个 dashify 函数,该函数将任何标志从 single_branch=True 转换为 single-branch,然后转换为 --single-branch

完整示例:

这是使用来自 GitHub 的个人访问令牌克隆单个浅分支的有用示例:

repo_url = "https://github.com/me/private-project.git"
branch = "wip-branch"
# Notice the trailing : below
credentials = base64.b64encode(f"{GHE_TOKEN}:".encode("latin-1")).decode("latin-1")
Repo.clone_from(
    url=repo_url,
    c=f"http.{repo_url}/.extraheader=AUTHORIZATION: basic {credentials}",
    single_branch=True,
    depth=1,
    to_path=f"/clone/to/here",
    branch=branch,
)

发送到 Popen 的命令列表如下所示:

['git', 'clone', '-v', '-c', 'http.https://github.com/me/private-project.git/.extraheader=AUTHORIZATION: basic XTE...UwNTo=', '--single-branch', '--depth=1', '--bare', '--branch=wip-branch', 'https://github.com/me/private-project.git', '/clone/to/here']

(PSA:请不要实际将您的个人令牌作为 URL 的一部分发送到 @ 之前。)