2012-01-04 10 views
3

私の目標は、Pythonから既存のGit reposにアクセスすることです。私はレポの歴史とオンデマンドの相違点を知りたい。Git Python入門

これを行うために、私はdulwichで始まりました。だから私が試した:doc

from dulwich.repo import Repo 
Repo.init('/home/umpirsky/Projects/my-exising-git-repo') 

をしてOSError: [Errno 17] File exists: '/home/umpirsky/Projects/my-exising-git-repo/.git

を得たYou can open an existing repository or you can create a new one.氏は述べています。

どうすればいいですか?ダーウィッヒで歴史と相違点を取り出すことはできますか? Gitへのアクセス用に他のlibをお勧めできますか?私はUbuntuアプリケーションを開発しています。そのため、より簡単に展開できるようにubuntuパッケージを用意しています。

私は定期的にリポジトリの新しい変更を検出するため、リモートで作業するので、ローカルに引き込まれていない変更を検出することもできます。どのようにこれがうまくいくのか分かりませんので、どんな助けもあります。

ありがとうございます。見てください、代替ライブラリの概要について

from dulwich.repo import Repo 
repo = Repo(<path>) 

+1

が、ヒント:これは、あなたが最初のリモートリポジトリから関連するコミットをフェッチする必要があり、その後、あなたがそれらを表示することができ、リモートリポジトリを検査することを意味します。 GITの "init"は、**リポジトリを作成する**コマンドです。だからあなたはドキュメントでもっと見ています。 –

+0

ええ、私もそうだと思っていますが、ドキュメントはとても貧弱です:) http://www.samba.org/~jelmer/dulwich/apidocs/dulwich.repo.BaseRepo.htmlを見ることができます。initは文書化されていません。 Repo.init( "myrepo"、mkdir = False)http://www.samba.org/~jelmer/dulwich/docs/tutorial/object-store.htmlを試しましたが、同じエラーが発生しました。 – umpirsky

+0

うん!私は1年前にgit-pythonを動かそうとしました。しかし、私はあきらめた。その後、私はさまざまなGITモジュールをPythonに読み込んで、サブプロセスを介してPythonを呼び出すようになりました。 –

答えて

3

Dulwichのドキュメントのほとんどは、Gitファイルフォーマット/プロトコルの知識をかなり前提としています。

あなたはRepoと既存のリポジトリ開くことができます:

from dulwich.repo import Repo 
x = Repo("/path/to/git/repo") 

をしたり、新しいものを作成します。

x = Repo.init("/path/to/new/repo") 

特定のためのdiffはその最初に(差分をコミット取得するには親)

from dulwich.patch import write_tree_diff 
commit = x[commit_id] 
parent_commit = x[commit.parents[0]] 
write_tree_diff(sys.stdout, x.object_store, parent_commit.tree, commit.tree) 

Gitプロトコルは、フェッチ/送信パックsでは、データベース内の特定のオブジェクトに直接アクセスすることはできません。私はダルウィッチ知らない

from dulwich.client import get_transport_and_path 
client, path = get_transport_and_path(remote_url) 
remote_refs = client.fetch(path, x) 
print x[remote_refs["refs/heads/master"]] 
+0

ありがとう、素晴らしい答え。私はこれで新しいので、いくつかのサブ質問をすることができます。これはあなたの最後のスニペットからのremote_refsですが、コミットは何ですか?たとえば、あなたのdulwich git repo http://gist.github.com/1562112を取得しました。私はhttps://github.com/jelmer/dulwich/commits/masterに載っていない奇妙なコミットを受け取りました。コミット時間でソートされます。私の目標は、すべてのコミットをコミット時間(最後のxコミットに限る)でソートすることです。再度、感謝します。 – umpirsky

+0

これはリポジトリの他のブランチとタグです。 https://github.com/jelmer/dulwich/branchesとhttps://github.com/jelmer/dulwich/tags – jelmer

+0

を参照してください。リモートマスターブランチのXの最後のcomnmitsにアクセスする場合は、おそらくsometihngが必要です。 – jelmer

6

私はinit方法は、あなたがそれにこの方法をパスを渡し、既存のものを開くために、新しいリポジトリを作成するために使用されていることを考えますこのanswer。基本的には、subprocessモジュールを使用する方が簡単だと示唆しています。これは、既に知っているインターフェイスを使用する最良の方法だからです。

+0

ありがとう、それはそのトリックでした。 repo.revision_history(repo.head())を使ってリビジョン履歴を取得できます。私は、特定のコミットで変更されたファイルのリストを取り出す方法はわかりませんが、私は実験を続けます。'サブプロセス 'を使わない理由は、出力の解析を避けたいからです。問題は、ローカルに引き出されていない新しいリビジョンをチェックする方法です。私は 'repo.revision_history(repo.head())'がローカルのチェックアウトだけを探していると思います。 – umpirsky

+0

RepoはパスではなくURIから作成できますか?私はそこにあることがわかります\t get_transport_and_path - URIまたはパスからgitクライアントを取得します。http://www.samba.org/~jelmer/dulwich/apidocs/dulwich.client.html#get_transport_and_pathこれはGitClientを返しますが、私はできませんそれに多くをしてください。一方、Repoは 'ローカルディスクに裏打ちされたgitリポジトリ 'というコメントで言います。 – umpirsky

+0

'dulwich.repo.Repo' docstringによれば、ローカルディスクにバックアップされた" gitリポジトリ "を開くことができます。 'dulwich.web.get_repo'はあなたが必要とするものを行うのに役立つかもしれませんが、使用する正しいバックエンドが何かを理解していないようです。 – jcollado