2016-04-25 18 views
0

私の最近の質問merging branches using GitPythonによると、私はそこでソリューションを単体テストしようとしています。これを行うには、ユーザーがマージツールを開いて、競合を解決して結果をコミットすることをシミュレートする必要があります。GitPythonとのマージ競合の解決をプログラムでシミュレートするにはどうすればよいですか?

私はこれを行う場合は、手動でCLIを使用して、すべてが動作しているようです:

echo 'Something to resolve the conflict' > conflicted_file.txt 
git add conflicted_file.txt 
git commit -m "Conflict resolved" 

私はGitPythonを使用して、同じプロセスをシミュレートしようとしました:

この..but
filename = 'conflicted_file.txt" 
with open(filename, 'w') as f: 
    f.write('Some combined content which resolves the merge issue') 
# repo is a git.Repo instance 
repo.index.add([filename]) 
repo.index.commit("Simulating user resolving a conflict"+filename) 

だけ上げます私の例外:

Traceback (most recent call last): 
    File "C:\Projects\grit\test_Gritter.py", line 240, in test_MergeConflicts 
    repo.index.commit("Simulating user resolving a conflict"+filename) 
    File "C:\Python34\lib\site-packages\git\index\base.py", line 934, in commit 
    tree = self.write_tree() 
    File "C:\Python34\lib\site-packages\git\index\base.py", line 531, in write_tree 
    binsha, tree_items = write_tree_from_cache(entries, mdb, slice(0, len(entries))) 
    File "C:\Python34\lib\site-packages\git\index\fun.py", line 234, in write_tree_from_cache 
    raise UnmergedEntriesError(entry) 
git.exc.UnmergedEntriesError: 100644 fd05580faebf11aee13944da595112eced471664 2 conflicted_file.txt 

私はそれを解決済みとしてマークする必要がありますか?

編集 - 私はちょうど明確にする

を自動化しようとしているかについて、いくつかのより多くの背景私はに更新されているリモートのmasterブランチの変更をマージするできるだけ簡単にしたいですリモートフィーチャーブランチは、マージの競合を解決します。

限り、私は承知しているとして、それを行うための正しい方法があるに:

  1. いくつかの変更
  2. がリモート
  3. に自分の変更をプッシュし
  4. 作るローカル機能ブランチ
  5. を作成します。一方、他の人が自分の変更をリモートマスターにマージするので、今度はその変更を自分のフィーチャーブランチにマージする必要があります...
  6. マスターに切り替えます(私のローカルチェックアウトにあります)
  7. リモート・マスターから
  8. プルは、私の地元の機能ブランチに私のローカルコピーいかなる紛争に
  9. プッシュリモート機能ブランチ

へのマージを解決

  • をマージする
  • 試みを
  • スイッチを更新し私はこれを今では一つのPythonスクリプトに収めていますが、この質問に関係する問題は上のステップでステップ9をシミュレートすることです。

  • +0

    それをあまりにも複雑な上、Gitはマージや競合を解決するために、より6別の方法を持っている....あなたは – CodeWizard

    +0

    :-)それを行うにしてもよろしいです明確にするために、私は自分のスクリプトで紛争解決を処理したくないので、ユーザーはそれをしなければならないが、リモートマスターから変更を引き出し、それらを機能ブランチにマージし、矛盾を解決して結果をプッシュするプロセスリモートブランチに...何度も何度も何度も何度も何度も何度も何度もやっているので、私はこのスクリプトを開発してすべてのタイピングを減らしています:) –

    +0

    何が問題なの? 'git pull ... --rebase'?コードを自動的にダウンロードしてマージします。矛盾があれば停止する – CodeWizard

    答えて

    0

    私はGitPythonの内部関数を使用しようとしましたが、単体テストから関連コマンドを取り除こうとすると、やや難解でした。最後に

    が、これは働いていた:

    g = git.Git('my/repo') 
    g.execute(["git","add","conflicted_file.txt"]) 
    g.execute(["git","commit","-m", "Conflict resolved"]) 
    
    関連する問題