1. ホーム
  2. git

[解決済み] フォルダからサブモジュールのリポジトリを作成し、そのgitコミット履歴を保持する

2022-07-07 05:19:33

質問

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

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

どのように解決するには?

詳しい解決方法

<ブロッククオート

npmを使ったgitサブモジュールの簡単な代替方法については、この回答の最後(最後の段落)にあるメモをご覧ください ;)

次の回答では、リポジトリからフォルダを抽出し、そこからgitリポジトリを作成する方法を知り、それを含む サブモジュール フォルダの代わりに

Gerg Bayerの記事からヒントを得ました。 Git リポジトリから別のリポジトリへ、履歴を残したままファイルを移動する

最初はこのようなものです。

<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

のファイルを含む git リポジトリを作成する必要があります。 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 urls を依存関係として指定します。 .

このようにすると、要件として使いたいリポジトリが 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 依存関係をインストールする場所