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

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

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

ソリューション

詳細な解決策

npmを使ったgitサブモジュールの簡単な代替案については、この回答の最後(最後の段落)にある注釈を参照してください ;)

次の回答では、リポジトリからフォルダを抽出して、そこからgitリポジトリを作成し、フォルダの代わりに[サブモジュール][3]としてインクルードする方法を知っていることになります。

Gerg Bayer's の記事 [Moving Files from one Git Repository to Another, Preserving History][1] からインスパイアされました。

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


    someFolders
    someFiles
    someLib `の痕跡(ファイルやコミット履歴)を``から削除し、このフォルダの履歴は一度だけにしたいのです。

これはgithubの[Removing sensitive data][2]を元にしています。

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

git clone cd git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch -r' --prune-empty --tag-name-filter cat -- --all



ディレクトリ1>`を削除したいフォルダに置き換えてください。r` は指定したディレクトリの中で再帰的に実行されます :)。次に、`--force` を使って `origin/master` にプッシュします。

git push origin master --force



## ボスステージ (下記注意事項参照)

サブモジュール][3]を `` から `` に作成する。

git submodule add git submodule update git commit



期待通りに動作しているか確認し、`push`します。

git push origin master




### 注意

ここまでやって、私の場合、代わりに[npm][4]を使って自分の依存関係を管理する方が適切だと気づきました。gitのURLやバージョンを指定することができるので、[package.json git urls as dependencies][6]を参照してください。

この方法でやる場合、要件として使いたいリポジトリは **npm module** である必要があるので、 `package.json` ファイルが含まれていないと、次のエラーが発生します: `Error.ENOENT, open ལ/*npm.json` ファイルを開くには、次のようにします: `package.json` ファイルが含まれていないと、要件として使いたいリポジトリは **npm module** である必要があります。ENOENT, open 'tmp.tgz-unpack/package.json'`.

# tldr (代替案)

npm][5] と [git urls で依存関係を管理する][6] を使うと楽かもしれません。

* 新しいリポジトリにフォルダを移動する
* 両方のリポジトリで `npm init` を実行します。
* 依存関係をインストールしたい場所で、 `npm install --save git://github.com/user/project.git#commit-ish` を実行します。

  [1]: http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/
  [2]: https://help.github.com/articles/remove-sensitive-data
  [3]: http://git-scm.com/book/en/Git-Tools-Submodules
  [4]:https://npmjs.org/
  [5]:https://npmjs.org/
  [6]:https://www.npmjs.org/doc/files/package.json.html#git-urls-as-dependencies
解説 (10)

GabLeRoux による解決策は、ブランチとそれに関連するコミットを潰しています。

余分なブランチやコミットをすべてクローンして保持するシンプルな方法です。

1 - この git エイリアスがあることを確認します。

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - リモートをクローンし、すべてのブランチをプルし、リモートを変更し、ディレクトリをフィルタリングし、プッシュします。

git clone git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags
解説 (0)

GabLeRoux'の解決策は、git lfsを使用していて、切り離したいディレクトリの下に大きなファイルがある場合以外はうまくいきます。この場合、ステップ3の後に、すべての大きなファイルが実際のファイルではなくポインターファイルとして残ります。おそらく、フィルターブランチの過程で .gitattributes ファイルが削除されたことが原因だと思います。

このことに気づいて、私は以下の解決策を見つけました。

cp .gitattributes .git/info/attributes

git lfs が大きなファイルを追跡するために使用する .gitattributes.git/ ディレクトリにコピーして、削除されないようにする。

フィルターブランチが完了したら、新しいリポジトリでも git lfs を使用したい場合は .gitattributes を元に戻すのを忘れないようにしてください。

mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'
解説 (0)