如何通过python

时间:2019-07-07 10:11:23

标签: python gitlab pygithub

我已经使用python中的文件操作创建了一个文本文件。我希望将文件推送到我现有的GITLAB存储库中。

我尝试了下面的代码,将创建的文件保存在本地文件夹中。

file_path = 'E:\My material\output.txt'
k= 'Fail/Pass'
with open (file_path, 'w+') as text:
    text.write('Test case :' +k)
    text.close() 

通过python代码将创建的文本文件移至GITLAB存储库的过程或​​对file_path的任何修改?

3 个答案:

答案 0 :(得分:0)

您是说用Python执行Shell命令吗?假设此新创建的文件和此python脚本都在特定的本地git存储库下,该存储库与要提交的远程存储库连接。我们的计划是将所有bash命令打包在os.system中。

import os 
os.system('git add E:\My material\output.txt; git commit -m "anything"; git push -u origin master')

更新

import os 
os.system('cd /local/repo; mv E:\My material\output.txt .; git add output.txt; git commit -m "anything"; git push -u origin master')

答案 1 :(得分:0)

使用python gitlab模块:

我们可以将文件推送到gitlab,但是您需要执行以下步骤:

步骤1)将存储库克隆到本地

第2步)将文件添加到已克隆的存储库

步骤3)将代码推送到gitlab

代码:

import gitlab  
import base64
from gitlab import Gitlab
import shutil

callbacks = pygit2.RemoteCallbacks(pygit2.UserPass("Your_private_token", 'x-oauth-basic'))
repoClone = pygit2.clone_repository("https://gitlab.com/group/"+api_name+".git", local_clone_path,checkout_branch=target_branch,callbacks=callbacks)  # clonning the repo to local
shutil.copy(src,dst_clone_repo_path)   #copy your file to the cloned repo
repoClone.remotes.set_url("origin", "https://gitlab.com/group/"+api_name+".git")
index = repoClone.index
index.add_all()
index.write()
tree = index.write_tree()
oid = repoClone.create_commit('refs/heads/'+target_branch, author, commiter, "init commit",tree,[repoClone.head.peel().hex])
remote = repoClone.remotes["origin"]
credentials = pygit2.UserPass("your_private_token", 'x-oauth-basic')  # passing credentials
remote.credentials = credentials
remote.push(['refs/heads/'+target_branch],callbacks=callbacks) # push the code to the gitlab repo

答案 2 :(得分:0)

聚会有点晚,但是:

使用 gitlab python 库,您可以这样做:


def commit_file(project_id: int, file_path: str, gitlab_url: str, private_token: str, branch: str = "main") -> bool:
    """Commit a file to the repository
    
    Parameters
    ----------
    project_id: int
        the project id to commit into. E.g. 1582
    file_path: str
        the file path to commit. NOTE: expecting a path relative to the
        repo path. This will also be used as the path to commit into.
        If you want to use absolute local path you will also have to 
        pass a parameter for the file relative repo path
    gitlab_url: str
        The gitlab url. E.g. https://gitlab.example.com
    private_token: str
        Private access token. See doc for more details
    branch: str
        The branch you are working in. See note below for more about this
    """
    gl = gitlab.Gitlab(gitlab_url, private_token=private_token)

    try:
        # get the project by the project id
        project = gl.projects.get(project_id)
        
        # read the file contents
        with open(file_path, 'r') as fin:
            content = fin.read()

        file_data = {'file_path': file_path,
                 'branch': branch,
                 'content': content,
                 'author_email': "your@email.com", # don't think this is required
                 'commit_message': 'Created a file'}

        resp = project.files.create(file_data)
        # do something with resp
    except gitlab.exceptions.GitlabGetError as get_error:
        # project does not exists
        print(f"could not find no project with id {project_id}: {get_error}")
        return False
    except gitlab.exceptions.GitlabCreateError as create_error:
        # project does not exists
        print(f"could not create file: {create_error}")
        return False

    return True

示例基于 gitlab project files documentation python-gitlab 包文档

请注意,如果要在新分支中创建文件,还必须提供 start_branch 属性:

file_data = {'file_path': file_path,
                 'branch': your_new_branch,
                 'start_branch': base_branch,
                 'content': content,
                 'author_email': "your@email.com",
                 'commit_message': 'Created a file in new branch'}

另外,如果你不关心使用python-gitlab包,你可以直接使用rest api(使用request或类似的东西。相关文档是here