使用 python-gitlab API 上传二进制文件
Upload binary files using python-gitlab API
我的任务是将 repos 迁移到 gitlab,我决定使用 python-gitlab 自动化该过程。一切正常,除了二进制文件或被认为是二进制文件,如编译目标文件 ( .o ) 或 .zip 文件。 (我知道存储库不是存储二进制文件的地方。我使用我得到的和我被告知要做的。)
我可以使用以下方式上传它们:
import gitlab
project = gitlab.Gitlab("git_adress", "TOKEN")
bin_content = base64.b64encode(open("my_file.o", 'rb').read() ).decode()
然后:
data = {'branch':'main', 'commit_message':'go away', 'actions':[{'action': 'create', 'file_path': "my_file.o", 'content': bin_content, 'encode' : 'base64'}]}
project.commits.create(data)
问题是 gitlab 存储库中此类文件的内容类似于:
f0VMRgIBAQAAAAAAAAAAAAEAPgABAAAAAAAAAAAAA....
这不是我想要的。
如果我不 .decode()
我会收到错误消息:
TypeError: Object of type bytes is not JSON serializable
这是预期的,因为我发送了以二进制模式打开并使用 base64
编码的文件。
我想要这样的文件 uploaded/stored 就像我使用 Web GUI 的“上传文件”选项上传它们一样。
是否可以使用 python-gitlab API 来实现?如果是,怎么做?
问题是 Python 的 base64.b64encode
函数将为您提供字节对象,但 REST API(具体来说,JSON 序列化)需要字符串。另外你想要的参数是 encoding
而不是 encode
.
这是要使用的完整示例:
from base64 import b64encode
import gitlab
GITLAB_HOST = 'https://gitlab.com'
TOKEN = 'YOUR API KEY'
PROJECT_ID = 123 # your project ID
gl = gitlab.Gitlab(GITLAB_HOST, private_token=TOKEN)
project = gl.projects.get(PROJECT_ID)
with open('myfile.o', 'rb') as f:
bin_content = f.read()
b64_content = b64encode(bin_content).decode('utf-8')
# b64_content must be a string!
f = project.files.create({'file_path': 'my_file.o',
'branch': 'main',
'content': b64_content,
'author_email': 'test@example.com',
'author_name': 'yourname',
'encoding': 'base64', # important!
'commit_message': 'Create testfile'})
然后在 UI 中,您将看到 GitLab 已将内容正确识别为二进制,而不是文本:
我的任务是将 repos 迁移到 gitlab,我决定使用 python-gitlab 自动化该过程。一切正常,除了二进制文件或被认为是二进制文件,如编译目标文件 ( .o ) 或 .zip 文件。 (我知道存储库不是存储二进制文件的地方。我使用我得到的和我被告知要做的。)
我可以使用以下方式上传它们:
import gitlab
project = gitlab.Gitlab("git_adress", "TOKEN")
bin_content = base64.b64encode(open("my_file.o", 'rb').read() ).decode()
然后:
data = {'branch':'main', 'commit_message':'go away', 'actions':[{'action': 'create', 'file_path': "my_file.o", 'content': bin_content, 'encode' : 'base64'}]}
project.commits.create(data)
问题是 gitlab 存储库中此类文件的内容类似于:
f0VMRgIBAQAAAAAAAAAAAAEAPgABAAAAAAAAAAAAA....
这不是我想要的。
如果我不 .decode()
我会收到错误消息:
TypeError: Object of type bytes is not JSON serializable
这是预期的,因为我发送了以二进制模式打开并使用 base64
编码的文件。
我想要这样的文件 uploaded/stored 就像我使用 Web GUI 的“上传文件”选项上传它们一样。
是否可以使用 python-gitlab API 来实现?如果是,怎么做?
问题是 Python 的 base64.b64encode
函数将为您提供字节对象,但 REST API(具体来说,JSON 序列化)需要字符串。另外你想要的参数是 encoding
而不是 encode
.
这是要使用的完整示例:
from base64 import b64encode
import gitlab
GITLAB_HOST = 'https://gitlab.com'
TOKEN = 'YOUR API KEY'
PROJECT_ID = 123 # your project ID
gl = gitlab.Gitlab(GITLAB_HOST, private_token=TOKEN)
project = gl.projects.get(PROJECT_ID)
with open('myfile.o', 'rb') as f:
bin_content = f.read()
b64_content = b64encode(bin_content).decode('utf-8')
# b64_content must be a string!
f = project.files.create({'file_path': 'my_file.o',
'branch': 'main',
'content': b64_content,
'author_email': 'test@example.com',
'author_name': 'yourname',
'encoding': 'base64', # important!
'commit_message': 'Create testfile'})
然后在 UI 中,您将看到 GitLab 已将内容正确识别为二进制,而不是文本: