[解決済み] フォルダからサブモジュールのリポジトリを作成し、そのgitコミット履歴を保持する
質問
特定の方法で他のウェブアプリケーションを探索するウェブアプリケーションがあります。このアプリケーションには、いくつかのウェブデモが
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
依存関係をインストールする場所
関連
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] ローカルファイルシステムからファイルを削除せずに、Git リポジトリからファイルを削除する
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Git リポジトリを特定のフォルダにクローンする方法は?
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git を使って前のコミットから分岐させる
-
[解決済み] Git のコミットからファイルを削除する
-
[解決済み] Git リポジトリで現在のコミットを唯一の(初期)コミットにする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[git push] 解決策: ! [リモート拒否] master -> master (受信前のフックは拒否されました)
-
解决[email protected]。パーミッションが拒否されました (publickey)。リモートリポジトリから読み取れませんでした
-
git pull エラー: .git/FETCH_HEAD を開けない: パーミッションが拒否されました。
-
Git がエラーを報告しました。現在のブランチの先端が遅れているため、更新が拒否されました。
-
git occurs このリポジトリで別のgitプロセスが動作しているようです。例えば、.NETで開いたエディタなど。エラー
-
[Gitラーニングノート】Gitのコンフリクト:マージする前に変更をコミットするかstashする。
-
gitの利用(ssh鍵の作成とgithubの利用)。
-
[解決済み] filter-branch --tree-filter の後に refs/original/heads/master を git repo から削除しますか?
-
[解決済み] Git フォルダをサブモジュールに遡及的に変換する?
-
[解決済み] git - コミットする前に現在の変更点の diff を取得する。