私はリポジトリを持っており、そのディレクトリの1つを新しいリポジトリに切り離したいと思います。 Thisは始めるには最適な場所ですが、1つの注意点があります。私が切り離したいディレクトリは、ある時点で名前が変更されました。そして、私がディレクトリの新しい名前でそのポストからの解決に従うならば、私は再命名の前に歴史を失っているようです。この状況で動作させるための調整のアイデアはありますか?サブディレクトリ(名前が変更されました!)を新しいリポジトリに追加
8
A
答えて
9
git filter-branch
はコミットの範囲で動作できます。私たちは何ができるか「前」と別に「の後」をフィルタリングし、それらを一緒にタックするために移植片を使用している:
git branch rename $COMMIT_ID_OF_RENAME
git branch pre-rename rename~
## First filter all commits up to rename, but not rename itself
git filter-branch --subdirectory-filter $OLDNAME pre-rename
## Add a graft, so our rename rev comes after the processed pre-rename revs
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts
## The first filter-branch left a refs backup directory. Move it away so the
## next filter-branch doesn't complain
mv .git/refs/original .git/refs/original0
## Now filter the rest
git filter-branch --subdirectory-filter $NEWNAME master ^pre-rename
## The graft is now baked into the branch, so we don't need it anymore
rm .git/info/grafts
これは、あなたが複数のブランチやタグをフィルタリングする必要がある場合は、わずかに、より複雑です。名前変更前のブランチは最初のフィルタブランチに含めることができ、後のブランチは2番目のフィルタブランチの^rename
の前に含める必要があります。
もう1つの方法として、インデックスのフィルタ(またはツリーフィルタ)を追加し、oldとnewの両方のディレクトリをチェックし、いずれかが存在するかどうかを調べる方法があります。
テスト・リポジトリを提供していないので、ここでは迅速な健全性チェックのスクリプトは、このシナリオのためです:
#!/bin/bash
set -u
set -e
set -x
rm -rf .git x y foo
git init
mkdir x
echo initial > x/foo
git add x/foo
git commit -m 'test commit 1'
echo tc2 >> x/foo
git commit -a -m 'test commit 2'
mv x y
git rm x/foo
git add y/foo
git commit -a -m 'test rename'
git branch rename HEAD
echo post rename >> y/foo
git commit -a -m 'test post rename'
git branch pre-rename rename~
git filter-branch --subdirectory-filter x pre-rename
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts
mv .git/refs/original .git/refs/original0
git filter-branch --subdirectory-filter y master ^pre-rename
rm .git/info/grafts
git log -u
この手順は、あなたのために動作しない場合は、奇数何か他のものがありそうです履歴に隠されている別の名前の変更など、記述していないリポジトリ履歴について
0
我々(マシュー・フラットと私は)これを行うためのプログラムを書いた:https://github.com/samth/git-slice
関連する問題
- 1. TortoiseGitはSVNリポジトリをクローンしました - 新しい変更を追加
- 2. テキストが変更された後に新しいボタンを追加します
- 3. 警告:ionic.projectの名前がionic.config.jsonに変更されました。名前を変更してください
- 4. リポジトリの更新動作が変更されましたか?
- 5. 新しい名前空間が追加されるたびに名前空間の位置が変更されます
- 6. アリ:同じ名前のサブディレクトリの名前を変更し
- 7. コアデータオブジェクトを追加した後にテーブルビューが更新されない
- 8. パラメータを追加した後にテーブルアダプタが更新されない
- 9. エントリを追加した後にテーブルが更新されない
- 10. フォルダがバイナリファイルとしてGitリポジトリに追加されました
- 11. NSValueTransformerの名前がValueTransformerに変更されました
- 12. NSURLSessionの名前がURLSessionに変更されました
- 13. C#のListに新しい要素を追加すると、前に追加された要素が変更されています
- 14. Gitは新しいファイルのみを追加します。変更されたファイルは追加しません
- 15. 名前が変更されたホームディレクトリ - Railsが起動しない
- 16. パッケージ名が新しいコード署名証明書で変更されました
- 17. MonoDevelopの名前変更された変数がiOSシミュレータを壊しました
- 18. gitリポジトリを新しいリポジトリのサブディレクトリにするには?
- 19. ファイル名が変更された(削除され、追加された)git変更の取り消し
- 20. ファイル名を変更して名前を変更しました
- 21. データフレームの追加された変数の名前を変更する
- 22. syncfusion ejtreegrid新しく追加されたノードを変更する
- 23. リポジトリ名を変更した後の起点を更新します
- 24. 新しいHashSetを前のHashSetに追加し、前のHashSetを変更して一定の条件が満たされるまで続行します
- 25. Google Maps APIに新しいクォータが追加されました。
- 26. 新しいメソッドがjavax.sql.CommonDataSourceに1.7で追加されました
- 27. 新しいjsonファイルがi18nフォルダに追加されました
- 28. データセットに新しい行が追加されました
- 29. ListBoxのスライドアニメーションが新しいアイテムに追加されました
- 30. Pycharm Django Projectに新しいファイルが追加されました
うーん、私は(私は何も知らなかった)移植片であなたの方法を試してみましたが、それは私のために動作しませんでした。 "前"コミットの1つを処理した後は空になり、別のもののファイルはそのレポのルートに移動しました。私はそれを理解できません。 私はツリーフィルタを使用する前に考えていましたが、それについての経験はありません。私はいくつかの指針を見せてくれますか? – akoprowski
コミット前に正しいサブディレクトリが使用されていますか?どこかでgit repoを投稿できますか? – bdonlan
うん、名前変更はその直前に名前を変更して名前を変更したコミットにあった。レポは巨大で部分的にプライベートなのでどこにでも公開することはできません: – akoprowski