我已经使用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的任何修改?
答案 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