web-dev-qa-db-ja.com

新しいファイルを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のドキュメント は読めません。長時間検索した後、適切なAPIを見つけることができません。

13
SparkAndShine

GitHub API を使用して複数のファイルをコミットしようとしました。 Git Data API のこのページは、「かなり単純」であるべきだと言っています。その調査の結果については、 this answer を参照してください。

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()

注:このバージョンのスクリプトは、リポジトリの親ディレクトリで実行されました。

14
David Cullen

注:このバージョンのスクリプトは、ファイルパスからリポジトリ名を削除したため、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への呼び出しが最終的にjson.dumpsRequester.py で呼び出し、次の例外が発生します:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte

PNGデータをbase64エンコードしてコミットすることで、この問題を回避します。後で、update_fileメソッドを使用してPNGデータを変更します。これにより、リポジトリへの2つの個別のコミットが行われますが、これはおそらく望んでいないものです。

4
David Cullen

PyGithubのドキュメントが使用できず(見た目もそうではない)、コミットをプッシュしたいだけなら(問題やレポ設定などで空想をしたくない)、おそらくgitと直接インターフェースする方が良いでしょう、 git実行可能ファイルを呼び出すか、 GitPython などのラッパーライブラリを使用します。

あなたが言及したsubprocess.Popenのようなものでgitを直接使用することは、おそらく学習曲線ではより簡単ですが、実際には持っていないので、エラー処理などのために長期的にはより困難です素敵な抽象化を渡すと、自分で解析を行う必要があります。

PyGithubを取り除くことで、GitHubとそのAPIに縛られることもなくなり、コンピューターの別のフォルダーでも、任意のリポジトリにプッシュできます。

1
MayeulC

いくつかの情報を提供できますが、具体的な解決策もあります。

ここ リポジトリに新しいファイルを追加する例があります。 ここ はこのためのビデオチュートリアルです。

以下に、GitHubの開発者ページにあるGitHubで動作するpythonパッケージのリストを示します。

ただし、必要に応じて、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)
1
vlad.rad
import subprocess
p = subprocess.Popen("git rev-parse HEAD".split(), stdout=subprocess.PIPE)
out, err = p.communicate()
sha = out.strip()

おそらくPyGithubでこれを行う方法はありますが、これは簡単なハックで機能するはずです。

0
Brian Malehorn

Pygithubを特に必要としない場合、dulwich git-libraryは 高レベルgitコマンド を提供します。コマンドについては https://www.dulwich.io/apidocs/dulwich.porcelain.html をご覧ください

0
janbrohl