6

Githubのオープンソースプロジェクトに貢献したいと思います。私のワークフローの前は次のとおりでした(VCSは使用されていません):

  1. ハードドライブに「working」フォルダと「clean」フォルダを保持しました。変更があったときに参照バージョンを更新し、「動作中」のバージョンで作業を続けました。
  2. プルリクエストを実行したい場合は、視覚的な比較プログラムでファイルを比較し、Github.com / source / edit fileにアクセスし、さまざまなファイルを手動で編集して、Webインターフェイスでプルリクエストを送信しました。

今、私はこのワークフローを(Gitを避けながら)近代化したかったのですが、5時間の試行錯誤の末に完全に立ち往生しています。私は次のことをしました:

  1. Githubの再現を自分のものにフォークしました
  2. フォークされた再現を複製し、git+ssh://git@github.comプッシュを可能にするためにURLを編集しました。Github-hg-Git-Mercurialはこれまでのところ完璧に機能しています。
  3. いつものようにフォークされたリプロの編集を開始しました。変更されたファイルなど
  4. 編集したファイルのプルリクエストを送信したい場合はどうすればよいですか?他の再現にクローンを作成し、そこで変更するだけで試しましたが、それがどのように役立つかわかりませんでした。

これまでのところ、私が思いついた唯一のアイデアは、ハードドライブに2つのフォークされた再現を保持することです。1つは「クリーン」で、もう1つは「作業」です。次に、ファイルを「work」から「clean」に物理的にコピーし、それらのファイルから「clean」再現でコミットを作成するだけです。しかし、これは物事を行うためのそのような「ハックな」方法のようです。ブックマーク/複製された再現または何かエレガントなものを使用したクリーンな方法が必要だと確信しています。

Mercurialを使用して選択的なプルリクエストを送信するための最適なワークフローを教えてください。

4

1 に答える 1

9

チェンジセットの一部のみを含むプルリクエストを実行することはできません。チェンジセットはMercurialとGitの両方で分離できません。

また、すべての祖先をプルせずにチェンジセットをプッシュまたはプル(またはプルを要求)することはできないため、毎回異なるファイルを使用して2回別々にコミットしても、コミットした場合に必要なものが得られません。あなたはあなたがすることの前にプッシュ/プル/送信したくありません。

そのため、機能ブランチを使用して、提出物を論理的に異なる開発ラインに分割する必要があります。

アップストリームリポジトリが次のようになっている場合:

[A]---[B]---[C]---[D]

クローンを作成すると、次のようになります。

[A]---[B]---[C]---[D]

次に、プルリクエストとして送信したいものと送信したくないものを含むチェンジセットを作成します。

[A]---[B]---[C]---[D]---[E]

あなたは運が悪い。Eのすべてを押さずに、Eの一部を押すことはできません。プッシュしたいものを1つのチェンジセット(F)に、プッシュしたくないもの(まだ?)を別のチェンジセット(E)にプッシュする(またはプルするように要求する)必要があります。

[A]---[B]---[C]---[D]---[E]---[F]

EはFの祖先であるため、Eを含めずにプッシュ(またはFをプルするように要求)することはできないため、まだ運が悪いです。

代わりに、親子ではなく、EとFを兄弟として機能させる必要があります。このような:

[A]---[B]---[C]---[D]---[E]
                     \
                      --[F]

これで、EなしでFをフォークにプッシュし、Eを見ることなくFを引き込むように要求できます

Mercurialを使用しているかどうかにかかわらず、その分岐コマンドは異なって見えます。

hg clone THEIRS # now you have A through D
... work ...
hg commit # now you created E, which you don't want to push
hg update D  # current directory no longer shows E
... work ...
hg commit # now you have F which is a child of D and a sibling of E
hg push -r .    # send F (but not E)

またはgit:

git clone THEIRS # now you have A through D
git checkout -b feature_e
... work ...
git commit # now you have created E, which you don't want to push
git checkout master # current directory no longer shows E
git checkout -b feature_f
... work ...
git commit # now you have created F, which you do want to share
git push -u origin feature_f  # send F but not E 

これで、E作業ではなく、F作業のみを含むブランチが作成され、必要なプル要求を行うことができます。

TL; DR:同じコミットまたはブランチで貢献と非貢献を混ぜ合わせたときには、運が悪かった。プルリクエストではなく、それらを分離するか、パッチを作成してパッチを送信する必要があります。

于 2012-09-13T00:04:55.380 に答える