2011-12-20 8 views
5

私のgitリポジトリにはmasterとdevelopmentという2つのブランチがあります。すべての変更を開発からマスターに自動的にマージするスクリプトが必要です。2 gitブランチを自動的にマージするスクリプトですか?

私はジェンキンスを使用:Gitのプラグインのクローンにリポジトリをしてから、このスクリプトは(「バージョン」変数は、ジョブのパラメータである)実行されます。

# merge 
git checkout -b develop origin/develop 
git checkout master 
git merge -Xtheirs --squash develop -m "v${version}" 

# commit 
git commit -m "v${version}" 

# tag 
git tag v${version} -m "v${version}" 

# push 
git push origin v${version} 

私はテスト用リポジトリ上でそれを試してみましたが、それがで失敗:

のgit -Xtheirsが
CONFLICTを(/削除、変更)を開発マージ:test.txtの開発で削除され、HEADに変更。 test.txtのバージョンHEADをツリーに残しました。
自動マージに失敗しました。競合を修正し、結果をコミットします。

にはどうすれば自動的にをこの競合を解決するのですか?マスターには決して触れないので、スクリプトは常に '開発'ブランチに従ってファイルを追加/変更/削除します。

+3

あなたは「マスターは触れたことはありません」しかし、あなたが得ることを言いますとにかく争い?実際に触れることがなければ、単純な 'git merge -ff-only origin/develop'で十分でしょう。 – fge

+1

マスターバージョンを 'origin/develop'バージョンで置き換え、マージコミットを記録しない場合は、なぜ' merge --nosquash'に気をつけますか? 'git checkout master && git reset origin/develop && git reset --soft HEAD @ {1}'またはそれに類するものではないでしょうか? –

答えて

5

-X theirsマージ戦略はファイル内の矛盾するハンクを解決するためにのみ機能します。これらのオプションのドキュメントがthe git-merge man pageである:

この場合
 ours 
      This option forces conflicting hunks to be auto-resolved 
      cleanly by favoring our version. Changes from the other tree 
      that do not conflict with our side are reflected to the merge 
      result. 

      This should not be confused with the ours merge strategy, which 
      does not even look at what the other tree contains at all. It 
      discards everything the other tree did, declaring our history 
      contains all that happened in it. 

     theirs 
      This is opposite of ours. 

他がそれを変更したが、一方の枝を異ならせた2つの枝の間の単純な矛盾塊は異なる場合である、ファイルを削除しました変更。

+0

gitが自動的に "ファイルを削除"を選択する方法はありますか? –

1

5歳....しかし、まだ関連性があります。私はから「マージ」したい 私はmasterブランチを削除して、枝から新しいマスターブランチを作成します:ここで

は私のソリューションです

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'` 
GIT_BRANCH_TO_MERGE_TO="master" 

git checkout "${GIT_BRANCH_TO_MERGE_TO}" 
git checkout "${GIT_BRANCH_TO_MERGE_FROM}" 

# Delete TO branch 
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin" 

# Create TO branch 
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin" 
関連する問題