131

特定の方法で他の Web アプリケーションを探索する Web アプリケーションがあります。フォルダーにいくつかの Web デモが含まれており、デモの 1 つにはdemos独自のリポジトリが必要です。このデモ アプリケーション用に別のリポジトリを作成し、サブパッケージ コミット履歴を失うことなく、メイン リポジトリからサブモジュールを削除します。

リポジトリのフォルダ内のファイルからコミット履歴を保持し、そこからリポジトリを作成して、代わりにサブモジュールとして使用することは可能ですか?

4

3 に答える 3

220

詳細なソリューション

npm を使用して git サブモジュールに代わる簡単な方法については、この回答の最後 (最後の段落) のメモを参照してください ;)

次の回答では、リポジトリからフォルダーを抽出し、そこから git リポジトリを作成し、それをフォルダーではなくサブモジュールとして含める方法がわかります。

Gerg Bayer の記事Moving Files from one Git Repository to another, Preserving Historyから着想を得た

最初に、次のようなものがあります。

<git repository A>
    someFolders
    someFiles
    someLib <-- we want this to be a new repo and a git submodule!
        some files

以下の手順では、これを と呼びsomeLibます<directory 1>

最後に、次のようになります。

<git repository A>
    someFolders
    someFiles
    @submodule --> <git repository B>

<git repository B>
    someFolders
    someFiles

別のリポジトリのフォルダーから新しい git リポジトリを作成する

ステップ1

分割するリポジトリの新しいコピーを取得します。

git clone <git repository A url>
cd <git repository A directory>

ステップ2

現在のフォルダーが新しいリポジトリになるため、現在のリモートを削除します。

git remote rm origin

ステップ 3

目的のフォルダの履歴を抽出してコミットします

git filter-branch --subdirectory-filter <directory 1> -- --all

directory 1これで、関連するすべてのコミット履歴を含むリポジトリのルートにあるファイルを含む git リポジトリが作成されます。

ステップ 4

オンライン リポジトリを作成し、新しいリポジトリをプッシュします。

git remote add origin <git repository B url>
git push

upstream最初のプッシュ用にブランチを設定する必要がある場合があります

git push --set-upstream origin master

クリーン<git repository A>(オプション、コメントを参照)

のトレース (ファイルとコミット履歴) を削除したい<git repository B>ので<git repository A>、このフォルダーの履歴は一度しかありません。

これは、github からの機密データの削除に基づいています。

新しいフォルダに移動し、

git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all

<directory 1>削除するフォルダーに置き換えます。-r指定されたディレクトリ内で再帰的に実行します:)。今プッシュorigin/masterする--force

git push origin master --force

ボスステージ(下の注を参照)

からサブモジュールを作成<git repository B>する<git repository A>

git submodule add <git repository B url>
git submodule update
git commit

すべてが期待どおりに機能したかどうかを確認し、push

git push origin master

ノート

これらすべてを行った後、自分の依存関係を管理するにはnpmを使用する方が適切であることに気付きました。git の URL とバージョンを指定できます。package.json の git の URL を依存関係として参照してください。

このようにすると、要件として使用するリポジトリはnpm モジュールpackage.jsonでなければならないため、ファイルが含まれている必要があります。そうしないと、次のエラーが発生しますError: ENOENT, open 'tmp.tgz-unpack/package.json'

tldr (代替ソリューション)

npmを使用し、依存関係を git urls で管理する方が簡単な場合があります。

  • フォルダーを新しいリポジトリに移動する
  • npm init両方のリポジトリ内で実行
  • 依存関係をインストールする場所で実行npm install --save git://github.com/user/project.git#commit-ishします
于 2013-08-08T15:12:15.130 に答える