如何通过 python 将创建的文件放入现有的 GITLAB 存储库中
How to place a created file in an existed GITLAB repository through python
我在 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 中的任何修改是什么。
您是说用 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')
使用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
晚会有点晚但是:
使用 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 package docs
请注意,如果要在新分支中创建文件,还必须提供 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 包,您可以直接使用其余 api(使用 request 或类似的东西。相关文档是 here
我在 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 中的任何修改是什么。
您是说用 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')
使用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
晚会有点晚但是:
使用 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 package docs
请注意,如果要在新分支中创建文件,还必须提供 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 包,您可以直接使用其余 api(使用 request 或类似的东西。相关文档是 here