如何将新文件推送到 GitHub?
How do I push new files to GitHub?
我在 github.com 上创建了一个新的存储库,然后使用
将其克隆到我的本地机器上
git clone https://github.com/usrname/mathematics.git
我在文件夹mathematics
下添加了3个新文件
$ tree
.
├── LICENSE
├── numerical_analysis
│ └── regression_analysis
│ ├── simple_regression_analysis.md
│ ├── simple_regression_analysis.png
│ └── simple_regression_analysis.py
现在,我想使用 Python,更具体地说,PyGithub 将 3 个新文件上传到我的 GitHub。这是我尝试过的:
#!/usr/bin/env python
# *-* coding: utf-8 *-*
from github import Github
def main():
# Step 1: Create a Github instance:
g = Github("usrname", "passwd")
repo = g.get_user().get_repo('mathematics')
# Step 2: Prepare files to upload to GitHub
files = ['mathematics/numerical_analysis/regression_analysis/simple_regression_analysis.py', 'mathematics/numerical_analysis/regression_analysis/simple_regression_analysis.png']
# Step 3: Make a commit and push
commit_message = 'Add simple regression analysis'
tree = repo.get_git_tree(sha)
repo.create_git_commit(commit_message, tree, [])
repo.push()
if __name__ == '__main__':
main()
我不知道
- 如何为
repo.get_git_tree
获取字符串 sha
- 如何在第 2 步和第 3 步之间建立连接,即推送特定文件
就我个人而言,PyGithub documentation 不可读。找了半天也没找到合适的api
import subprocess
p = subprocess.Popen("git rev-parse HEAD".split(), stdout=subprocess.PIPE)
out, err = p.communicate()
sha = out.strip()
可能有一种方法可以用 PyGithub 做到这一点,但这应该可以快速破解。
如果您不需要 pygithub,dulwich git-library 提供 high level git commands. For the commands have a look at https://www.dulwich.io/apidocs/dulwich.porcelain.html
我可以给你一些信息支持,也可以提供一个具体的解决方案。
Here you can find examples of adding new files to your repository, and here 是一个视频教程。
您可以在下方看到与 GitHub 一起工作的 python 软件包列表,这些软件包在 GitHub 的开发者页面上找到:
但如果需要,您也可以使用 IPython 中的命令推送文件:
In [1]: import subprocess
In [2]: print subprocess.check_output('git init', shell=True)
Initialized empty Git repository in /home/code/.git/
In [3]: print subprocess.check_output('git add .', shell=True)
In [4]: print subprocess.check_output('git commit -m "a commit"', shell=True)
我尝试使用 GitHub API to commit multiple files. This page for the Git Data API says that it should be "pretty simple". For the results of that investigation, see 。
我建议使用 GitPython:
from git import Repo
repo_dir = 'mathematics'
repo = Repo(repo_dir)
file_list = [
'numerical_analysis/regression_analysis/simple_regression_analysis.py',
'numerical_analysis/regression_analysis/simple_regression_analysis.png'
]
commit_message = 'Add simple regression analysis'
repo.index.add(file_list)
repo.index.commit(commit_message)
origin = repo.remote('origin')
origin.push()
注意:此版本的脚本在存储库的父目录中运行。
如果 PyGithub 的文档不可用(而且看起来不可用),而你只想推送一个提交(不做任何花哨的问题、回购配置等),你可能会更好直接与 git 接口,调用 git
可执行文件或使用包装器库,例如 GitPython。
直接将 git
与您提到的 subprocess.Popen
之类的东西一起使用可能会在倾斜曲线上更容易,但从长远来看错误处理等也会更加困难,因为您不'真的有很好的抽象可以传递,并且必须自己进行解析。
摆脱 PyGithub 还可以让您摆脱 GitHub 及其 API 的束缚,让您可以推送到任何存储库,甚至是计算机上的另一个文件夹。
注意:此版本的脚本是从 GIT 存储库内部调用的,因为我从文件路径中删除了存储库名称。
我终于想通了如何使用 PyGithub 提交多个文件:
import base64
from github import Github
from github import InputGitTreeElement
token = '5bf1fd927dfb8679496a2e6cf00cbe50c1c87145'
g = Github(token)
repo = g.get_user().get_repo('mathematics')
file_list = [
'numerical_analysis/regression_analysis/simple_regression_analysis.png',
'numerical_analysis/regression_analysis/simple_regression_analysis.py'
]
commit_message = 'Add simple regression analysis'
master_ref = repo.get_git_ref('heads/master')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
element_list = list()
for entry in file_list:
with open(entry, 'rb') as input_file:
data = input_file.read()
if entry.endswith('.png'):
data = base64.b64encode(data)
element = InputGitTreeElement(entry, '100644', 'blob', data)
element_list.append(element)
tree = repo.create_git_tree(element_list, base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message, tree, [parent])
master_ref.edit(commit.sha)
""" An egregious hack to change the PNG contents after the commit """
for entry in file_list:
with open(entry, 'rb') as input_file:
data = input_file.read()
if entry.endswith('.png'):
old_file = repo.get_contents(entry)
commit = repo.update_file('/' + entry, 'Update PNG content', data, old_file.sha)
如果我尝试从 PNG 文件添加原始数据,对 create_git_tree
的调用最终会调用 Requester.py
中的 json.dumps
,这会导致引发以下异常:
UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte
我通过 base64
编码 PNG 数据并提交来解决这个问题。后来,我使用 update_file
方法更改 PNG 数据。这会导致两次单独提交到存储库,这可能不是您想要的。
使用子流程,这将完成相同的工作-
import subprocess
subprocess.call(['git', 'add', '-A'])
subprocess.call(['git', 'commit', '-m', '{}'.format(commit_message)])
subprocess.call(['git', 'push', 'https://{}@github.com/user-name/repo.git'.format(token)])
确保使用 -A 或 -all 来跟踪父目录中 project/even 中的所有文件。使用 'git add .' 将仅跟踪写入此代码的 cwd 内的文件。
我在 github.com 上创建了一个新的存储库,然后使用
将其克隆到我的本地机器上git clone https://github.com/usrname/mathematics.git
我在文件夹mathematics
$ tree
.
├── LICENSE
├── numerical_analysis
│ └── regression_analysis
│ ├── simple_regression_analysis.md
│ ├── simple_regression_analysis.png
│ └── simple_regression_analysis.py
现在,我想使用 Python,更具体地说,PyGithub 将 3 个新文件上传到我的 GitHub。这是我尝试过的:
#!/usr/bin/env python
# *-* coding: utf-8 *-*
from github import Github
def main():
# Step 1: Create a Github instance:
g = Github("usrname", "passwd")
repo = g.get_user().get_repo('mathematics')
# Step 2: Prepare files to upload to GitHub
files = ['mathematics/numerical_analysis/regression_analysis/simple_regression_analysis.py', 'mathematics/numerical_analysis/regression_analysis/simple_regression_analysis.png']
# Step 3: Make a commit and push
commit_message = 'Add simple regression analysis'
tree = repo.get_git_tree(sha)
repo.create_git_commit(commit_message, tree, [])
repo.push()
if __name__ == '__main__':
main()
我不知道
- 如何为
repo.get_git_tree
获取字符串 - 如何在第 2 步和第 3 步之间建立连接,即推送特定文件
sha
就我个人而言,PyGithub documentation 不可读。找了半天也没找到合适的api
import subprocess
p = subprocess.Popen("git rev-parse HEAD".split(), stdout=subprocess.PIPE)
out, err = p.communicate()
sha = out.strip()
可能有一种方法可以用 PyGithub 做到这一点,但这应该可以快速破解。
如果您不需要 pygithub,dulwich git-library 提供 high level git commands. For the commands have a look at https://www.dulwich.io/apidocs/dulwich.porcelain.html
我可以给你一些信息支持,也可以提供一个具体的解决方案。
Here you can find examples of adding new files to your repository, and here 是一个视频教程。
您可以在下方看到与 GitHub 一起工作的 python 软件包列表,这些软件包在 GitHub 的开发者页面上找到:
但如果需要,您也可以使用 IPython 中的命令推送文件:
In [1]: import subprocess
In [2]: print subprocess.check_output('git init', shell=True)
Initialized empty Git repository in /home/code/.git/
In [3]: print subprocess.check_output('git add .', shell=True)
In [4]: print subprocess.check_output('git commit -m "a commit"', shell=True)
我尝试使用 GitHub API to commit multiple files. This page for the Git Data API says that it should be "pretty simple". For the results of that investigation, see
我建议使用 GitPython:
from git import Repo
repo_dir = 'mathematics'
repo = Repo(repo_dir)
file_list = [
'numerical_analysis/regression_analysis/simple_regression_analysis.py',
'numerical_analysis/regression_analysis/simple_regression_analysis.png'
]
commit_message = 'Add simple regression analysis'
repo.index.add(file_list)
repo.index.commit(commit_message)
origin = repo.remote('origin')
origin.push()
注意:此版本的脚本在存储库的父目录中运行。
如果 PyGithub 的文档不可用(而且看起来不可用),而你只想推送一个提交(不做任何花哨的问题、回购配置等),你可能会更好直接与 git 接口,调用 git
可执行文件或使用包装器库,例如 GitPython。
直接将 git
与您提到的 subprocess.Popen
之类的东西一起使用可能会在倾斜曲线上更容易,但从长远来看错误处理等也会更加困难,因为您不'真的有很好的抽象可以传递,并且必须自己进行解析。
摆脱 PyGithub 还可以让您摆脱 GitHub 及其 API 的束缚,让您可以推送到任何存储库,甚至是计算机上的另一个文件夹。
注意:此版本的脚本是从 GIT 存储库内部调用的,因为我从文件路径中删除了存储库名称。
我终于想通了如何使用 PyGithub 提交多个文件:
import base64
from github import Github
from github import InputGitTreeElement
token = '5bf1fd927dfb8679496a2e6cf00cbe50c1c87145'
g = Github(token)
repo = g.get_user().get_repo('mathematics')
file_list = [
'numerical_analysis/regression_analysis/simple_regression_analysis.png',
'numerical_analysis/regression_analysis/simple_regression_analysis.py'
]
commit_message = 'Add simple regression analysis'
master_ref = repo.get_git_ref('heads/master')
master_sha = master_ref.object.sha
base_tree = repo.get_git_tree(master_sha)
element_list = list()
for entry in file_list:
with open(entry, 'rb') as input_file:
data = input_file.read()
if entry.endswith('.png'):
data = base64.b64encode(data)
element = InputGitTreeElement(entry, '100644', 'blob', data)
element_list.append(element)
tree = repo.create_git_tree(element_list, base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message, tree, [parent])
master_ref.edit(commit.sha)
""" An egregious hack to change the PNG contents after the commit """
for entry in file_list:
with open(entry, 'rb') as input_file:
data = input_file.read()
if entry.endswith('.png'):
old_file = repo.get_contents(entry)
commit = repo.update_file('/' + entry, 'Update PNG content', data, old_file.sha)
如果我尝试从 PNG 文件添加原始数据,对 create_git_tree
的调用最终会调用 Requester.py
中的 json.dumps
,这会导致引发以下异常:
UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte
我通过 base64
编码 PNG 数据并提交来解决这个问题。后来,我使用 update_file
方法更改 PNG 数据。这会导致两次单独提交到存储库,这可能不是您想要的。
使用子流程,这将完成相同的工作-
import subprocess
subprocess.call(['git', 'add', '-A'])
subprocess.call(['git', 'commit', '-m', '{}'.format(commit_message)])
subprocess.call(['git', 'push', 'https://{}@github.com/user-name/repo.git'.format(token)])
确保使用 -A 或 -all 来跟踪父目录中 project/even 中的所有文件。使用 'git add .' 将仅跟踪写入此代码的 cwd 内的文件。