2016-07-26 3 views
11

는 내가하고 싶은, 내가 mathematics새 파일을 GitHub에 푸시하는 방법은 무엇입니까?

$ tree 
. 
├── LICENSE 
├── numerical_analysis 
│   └── regression_analysis 
│    ├── simple_regression_analysis.md 
│    ├── simple_regression_analysis.png 
│    └── simple_regression_analysis.py 

이제 폴더 아래에 3 개 개의 새 파일을 추가

git clone https://github.com/usrname/mathematics.git 

내 로컬 컴퓨터에 복제 후 github.com에 새 저장소를 생성 파이썬을 사용하여 3 개의 새 파일을 GitHub에 업로드하십시오. 구체적으로는 PyGithub입니다. 여기에 내가 시도 것입니다 :

#!/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() 

모르겠어요

  • 내가 즉, 2 단계와 3 사이의 연결이 밀어 어떻게해야합니까 repo.get_git_tree
  • 의 캐릭터 sha을 얻는 방법 특정 파일

개인적으로는 PyGithub documentation을 읽을 수 없습니다. 오랜 시간 동안 검색 한 후에 올바른 API를 찾을 수 없습니다.

+1

'sha '를 얻으려면'hashlib'을 사용해야합니다. –

+5

@WayneWerner 이것은 분명히해야 할 일이 아닙니다. 'sha'는'git'에 의해 계산되며, 여러분이 직접 계산하려고하면 틀리게 될 것입니다. –

+0

@BrianMalehorn 저는 CURL과 github api 인 IIRC를 통해 제 자식 커밋을 업로드 할 수있는 bash 스크립트를 가지고 있습니다. –

답변

7

나는를 사용하려고 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() 

참고 : 스크립트의이 버전은 저장소의 상위 디렉토리에 실행 된.

0
import subprocess 
p = subprocess.Popen("git rev-parse HEAD".split(), stdout=subprocess.PIPE) 
out, err = p.communicate() 
sha = out.strip() 

PyGithub로이 작업을 수행 할 수있는 방법이 있지만 빠른 해킹이 필요합니다.

0

특별히 pygithub이 필요하지 않은 덜 리치 자식 도서관은 high level git commands을 제공합니다. 명령에 대한 좀 봐 https://www.dulwich.io/apidocs/dulwich.porcelain.html

+0

빠른 응답을위한 Thx. MWE를 제공 할 수 있다면 매우 좋을 것입니다. – SparkAndShine

+0

@sparkandshine 죄송합니다 - MWE 무엇입니까? 최소한의 작업 예제? – janbrohl

+0

정확하게, [최소 작업 예제] (https://en.wikipedia.org/wiki/Minimal_Working_Example) – SparkAndShine

1

나는 약간의 정보 지원뿐만 아니라 하나의 구체적인 솔루션을 줄 수 있습니다.

Here 새 파일을 저장소에 추가하는 예를 찾을 수 있으며 here은이를위한 비디오 자습서입니다.

은뿐만 아니라 당신은 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

PyGithub의 설명서를 사용할 수없고 (그렇게 보이지 않는 경우) 커밋을 푸시 (문제, repo 설정 등을 좋아하지 않는 것)하고 싶다면 직접 직접 실행하는 것이 좋습니다 git과 인터페이싱하여 git 실행 파일을 호출하거나 GitPython과 같은 래퍼 라이브러리를 사용합니다.

subprocess.Popen과 같은 것으로 직접 git을 사용하면 주위를 돌아 다니기에 좋은 추상화가 없으므로 기울어 진 곡선에서는 더 쉬울 것이지만 오류 처리 등은 장기간에 더 어려울 것입니다. , 그리고 자신을 파싱해야 할 것입니다.

PyGithub을 없애면 GitHub 및 API에 묶여 있지 않아도 컴퓨터의 다른 폴더에있는 Repo를 푸시 할 수 있습니다.

1

참고 :이 스크립트 버전은 파일 경로에서 저장소 이름을 제거했기 때문에 GIT 저장소 내부에서 호출되었습니다.

내가 마지막으로 여러 파일을 커밋 PyGithub을 사용하는 방법을 알아 냈 : 나는 PNG 파일에서 원시 데이터를 추가하려고하면

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) 

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 데이터를 변경합니다. 그 결과 저장소에 대한 두 개의 별도 커밋이 생기고 아마도 여러분이 원하는 것은 아닙니다.

관련 문제