89

2つのリポジトリがあります。1つはライブラリのメインリポジトリで、もう1つはそのライブラリを使用するプロジェクトです。

subservientプロジェクトで修正を加えた場合、そのパッチをアップストリームに適用する簡単な方法が必要です。

ファイルの場所はリポジトリごとに異なります。

  • メインレポ:www.playdar.org/static/playdar.js
  • 計画:playlick.com/lib/playdar.js

git format-patch -- lib/playdar.jsplaylickプロジェクトで使用してgit amから、メインのplaydarリポジトリで使用してみましたが、パッチファイル内のファイルの場所が異なるとエラーが発生しました。

特定のファイルの特定のコミットから別の任意のファイルにパッチを適用する簡単な方法はありますか?

ボーナスポイントについては、パッチを適用するファイルがgitリポジトリにない場合はどうなりますか?

4

7 に答える 7

127

パッチ ファイルを手動で編集することが問題外または実行不可能な場合は、標準オプション ( および GNU で使用可能) を使用してこれを行うことがgit applyできgit format-patchますpatch

  1. -p<n>nパッチ内のパスから先頭のディレクトリを削除します。

  2. を処理した後-p、適用する前にパッチ内の各パスに--directory=<root>付加します。root

したがって、あなたの例では、最初にオンになっていたパッチを取得してにstatic/playdar.js適用するにはlib/playdar.js、次を実行します。

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'
于 2012-06-29T14:43:36.807 に答える
40

によって生成されるパッチgit format-patchは単なるテキスト ファイルです。差分ヘッダーを編集して、別のパスを変更することができます。

したがって、たとえば、次のようなものが生成されます。

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

あなたがしなければならないのは、変更lib/playdar.jsしてからstatic/playdar.jsパッチを実行することだけですgit am"

パッチは、標準の GNU パッチ ユーティリティで読み取り可能であるべきですが、git---を持っていないが、名前変更パッチを生成するためになどのオプションを指定して実行format-patchする必要はありません。これらのサポートは普遍的ではないためです。-M-C

于 2009-05-31T12:53:01.060 に答える
4

両方のプロジェクトがgitプロジェクトであると仮定すると、サブモジュールが最適であるように思われます。これにより、gitプロジェクトは別のgitプロジェクトに動的にリンクでき、基本的には別のgitレポジトリ内でgitレポジトリをベイク処理できます。どちらも独自のライフスタイルを持っています。

つまり、「プロジェクト」のサブモジュールとして「メインリポジトリ」を追加します。「メインリポジトリ」で新しいものをコミット/プッシュするときはいつでも、git pullそれらを「プロジェクト」に戻すだけです。

于 2009-05-31T11:48:17.947 に答える
2

Henrik の答えを完成させ、ボーナス ポイントを獲得するには

パッチを適用したいファイルが git リポジトリにない場合はどうなりますか?

git リポジトリからのパッチのファイル候補のディレクトリにアクセスできる場合は、最初にそのディレクトリ/ファイルのツリーを git リポジトリ自体に変換できます。(' git init': git リポジトリは、結局のところ、ルート ディレクトリ内の単なる .git です)。
次に、そのリポジトリをメイン プロジェクトのサブモジュールとして設定します。

于 2009-05-31T12:01:06.360 に答える
1

メインリポジトリを一時的に削除(名前変更)するだけです。

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git
于 2015-03-03T09:29:25.853 に答える
1

新しいリモコンを追加して、そこから引き出すことができます。詳細のある記事。

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA
于 2014-12-29T06:25:34.353 に答える