特定の方法で他の Web アプリケーションを探索する Web アプリケーションがあります。フォルダーにいくつかの Web デモが含まれており、デモの 1 つにはdemos
独自のリポジトリが必要です。このデモ アプリケーション用に別のリポジトリを作成し、サブパッケージ コミット履歴を失うことなく、メイン リポジトリからサブモジュールを削除します。
リポジトリのフォルダ内のファイルからコミット履歴を保持し、そこからリポジトリを作成して、代わりにサブモジュールとして使用することは可能ですか?
特定の方法で他の Web アプリケーションを探索する Web アプリケーションがあります。フォルダーにいくつかの Web デモが含まれており、デモの 1 つにはdemos
独自のリポジトリが必要です。このデモ アプリケーション用に別のリポジトリを作成し、サブパッケージ コミット履歴を失うことなく、メイン リポジトリからサブモジュールを削除します。
リポジトリのフォルダ内のファイルからコミット履歴を保持し、そこからリポジトリを作成して、代わりにサブモジュールとして使用することは可能ですか?
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 clone <git repository A url>
cd <git repository A directory>
現在のフォルダーが新しいリポジトリになるため、現在のリモートを削除します。
git remote rm origin
目的のフォルダの履歴を抽出してコミットします
git filter-branch --subdirectory-filter <directory 1> -- --all
directory 1
これで、関連するすべてのコミット履歴を含むリポジトリのルートにあるファイルを含む git リポジトリが作成されます。
オンライン リポジトリを作成し、新しいリポジトリをプッシュします。
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'
。
npmを使用し、依存関係を git urls で管理する方が簡単な場合があります。
npm init
両方のリポジトリ内で実行npm install --save git://github.com/user/project.git#commit-ish
します