取り外し(移動)サブディレクトリを別Gitリポジトリ
-
21-08-2019 - |
質問
してい Git リポジトリを含む複数のサブディレクトリ.現在、このサブディレクトリとは関係のない部分ですがその他のやるべき一戸建ての個別のリポジトリ
する方法を教えてくださいこの歴史のファイル内のサブディレクトリ?
って終わってしまったクローンを取り外し不要な部品の各クローンが思うの完全ツリー時チェックアウトの古い修正など。これでも良いでしょうが、私の好きな振りのリポジトリがないのに共有します。
だけでは明らかで、私は以下のような構造をとります:
XYZ/
.git/
XY1/
ABC/
XY2/
いつづけたいと思っていますこの替り:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
解決
更新:このプロセスは共通のgitのチームでより簡単な新しいツール git subtree
.こちらをご参照: 取り外し(移動)サブディレクトリを別Gitリポジトリ
したいクローンポートおよびその利用 git filter-branch
をマークすべてのサブディレクトリのない新しいレポするごみを収集します。
ローカルリポジトリ:
git clone /XYZ /ABC
(注:のリポジトリがクローニング用のハードリンク、それは問題ではありませんから、ハード-サファイルは変更されることはありませんで自分たちで新しいものを作成します。)
現在、保全の面白い店舗いて書き換えとして、取り外してくださの原点を回避を押してある古いを犯しない植物の自家不和合性遺伝子機能の原点:
cd /ABC for i in branch1 br2 br3; do git branch -t $i origin/$i; done git remote rm origin
たはリモート店
cd /ABC for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done git remote rm origin
現するために取り外しもタグを持つのサブテーマ;きもとで入手できるかもしれませんが、必要なプルーンにおrepoます。なかったことのないようん
WARNING: Ref 'refs/tags/v0.1' is unchanged
すべてのタグ以降に大いに関係のないサブテーマ);また、を取り除いた後などのタグスペースが再生.どうやらgit filter-branch
できる書き換えその他のタグも確認を行っておりません。除する場合には全てのタグを使用git tag -l | xargs git tag -d
.し使用フィルター-支店およびリセットを含みますし、それらのファイルにすることが可能ですので、剪定.ましょうも追加
--tag-name-filter cat --prune-empty
削除を空にする為に書き換えタグ(注することをグレーのクラムシェル型クランプの署名):git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
また、み書き換えに本店を無視するタグやその他の支店:
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
削除し、バックアップreflogsのスペースを希望される方は埋め立ては現在の操作が破壊)
git reset --hard git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --aggressive --prune=now
していけば、現地のgitリポジトリのABCディレクトリのサブディレクトリとそのすべての歴史保存されている。
注意:ほとんどの用途 git filter-branch
この追加のパラメータ -- --all
.有する --スペース-- all
.このニーズにおける最後のパラメータのコマンドです。としてMatliを発見し、このプロジェクトの支店とタグの新しい呼ぶ。
編集:様々なご提案からコメントを下記したいので、インスタンスのリポジトリが実際に縮小したが常に共通しているわけではない場合の前で紹介したことがありますか?
他のヒント
The Easy Way™
ここで示されていることに役立つ実務のoverlords gitでも簡単にない新しいバージョンのgit(>=1.7.11 2012).を参照 付録 のためのインストール方法は、最新のgit.もよりますが、 実例 の ウォークスルー ます。
準備のレポ
pushd <big-repo> git subtree split -P <name-of-folder> -b <name-of-new-branch> popd
注意:
<name-of-folder>
などを含めないでください先頭または末尾文字です。例えば、フォルダの名前subproject
重要なことを報告し、必要に応としてsubproject
, ない./subproject/
注意windowsユーザ: 時にフォルダの深さは>1,
<name-of-folder>
は*nixスタイルのフォルダ区切り文字(/).例えば、フォルダの名前path1\path2\subproject
重要なことを報告し、必要に応としてpath1/path2/subproject
新しいレポ
mkdir <new-repo> pushd <new-repo> git init git pull </path/to/big-repo> <name-of-new-branch>
リンクを新しいレポ-レートをGithubはどこまも
git remote add origin <git@github.com:my-user/new-repo.git> git push origin -u master
浄化 希望の場合
popd # get out of <new-repo> pushd <big-repo> git rm -rf <name-of-folder>
注意:この歴史的文献のリポジトリを参照 付録 以下の場合にだけ実際に懸念を有する取組方針当社グループパスワードが必要減少のファイルサイズの
.git
フォルダにまとめた。
...
ウォークスルー
これらの 同じ手順として上記の, ものであるが、私の正確なステップマリポジトリの代わりに <meta-named-things>
.
このプロジェクトっての実施のためのJavaScriptはブラウザモジュールノード:
tree ~/Code/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
したいとしているので、フォルダに btoa
, は、別のgitリポジトリ
pushd ~/Code/node-browser-compat/
git subtree split -P btoa -b btoa-only
popd
って新しい支店 btoa-only
, るだけでコミット btoa
い新しいリポジトリ
mkdir ~/Code/btoa/
pushd ~/Code/btoa/
git init
git pull ~/Code/node-browser-compat btoa-only
次の新規作成しますrepo Githubはbitbucket、または何を追加する origin
(余談ですが、"起源"はコンベンションは、コマンドとも言えましょう"リモート-サーバー"または合わせてご利用いただけま)
git remote add origin git@github.com:node-browser-compat/btoa.git
git push origin -u master
嬉しい!
注意: 作成した場合レポる README.md
, .gitignore
や LICENSE
, る必要がありま引先:
git pull origin -u master
git push origin -u master
最後に、私がしたい削除フォルダからの大きなレポ
git rm -rf btoa
...
付録
最新のgit OS X
の最新バージョンのgit:
brew install git
を醸し出OS X:
最新のgit Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
いない非常に古いバージョンのubuntu)、
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
まもなく
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
コ瑞.酸からのコメントです。
清貴史
デフォルトのファイル削除gitない実際には、削除gitにおいて、犯となります。したい場合は実際に削除の歴史的文献(お持ちのする取組方針当社グループパスワード)を行う必要があります。す:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
その後できることを確認ファイルやフォルダなくなったちのクリスマスの過ごし方はgitの歴史で
git log -- <name-of-folder> # should show nothing
ただし、 できない"push"を削除すgithub します。使ってみればしょにエラーとかできない git pull
ことができる前に git push
-しんり返るものです。
なので削除したい履歴からの"原点"ということを削除しまからはgithub、bitbucketなどにする必要がありまを削除するレポおよび再押し剪定のコピーを呼ぶ。でも、ちょっと待った- あり!-だんつうパスワードのダイナミックレンジの広いる必要がありまプルーン、バックアップします(下記参照)。
作 .git
小
上記の削除履歴のコマンドが残っバックアップファイルがgitはあまりに種類は以下の形で貴社をお手伝いしますな破綻にレポ-レート。まって削除され孤児にファイルに、そしてあらた場合に気づき始めるでしょう。誤って削除されるようなものではないです。
でん 空のゴミ箱 へ 削減のクローンのサイズ のレポ直していこう。
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
と思わないことをお勧めしを行うこれらの手順になることをご存知だった場合、またプルーン、間違ったサブディレクトリ,y'know?バックアップファイルだクローンをプッシュすると、レポ-レートは、彼らはそれだけに、地域コピーします。
信用
ポールの答えには、/ ABCを含む新しいリポジトリを作成しますが、/ XYZ内から/ ABCは削除されません。次のコマンドは、/ XYZ内から/ ABCが削除されます:
git filter-branch --tree-filter "rm -rf ABC" --prune-empty HEAD
もちろん、最初の「--no-ハードリンククローン」リポジトリにそれをテストし、リセットして、それに続く、GCとプルーンは、ポール・リストをコマンドます。
私はこのため、適正に削除し、古い歴史から新しいリポジトリやらなければいけないということもう少し作業後の filter-branch
ます。
のクローンのフィルタ:
git clone --no-hardlinks foo bar; cd bar git filter-branch --subdirectory-filter subdir/you/want
削除毎の歴史"原点"のつのクローンは、"オリジナル"ではフィルター-支店に保存する古いもの:
git remote rm origin git update-ref -d refs/original/refs/heads/master git reflog expire --expire=now --all
現在でも、歴史が詰packfileるfsckいます。涙でshreds、新packfile、削除には使用しないオブジェクト:
git repack -ad
はありま この の マニュアルフィルター-支店を.
の編集:bashスクリプトを追加の
。ここで与えられた答えは部分的に私のためだけに働きました。大きなファイルの多くは、キャッシュに残っていました。どのような最終的には(freenodeの上#gitに時間後)勤務ます:
git clone --no-hardlinks file:///SOURCE /tmp/blubb
cd blubb
git filter-branch --subdirectory-filter ./PATH_TO_EXTRACT --prune-empty --tag-name-filter cat -- --all
git clone file:///tmp/blubb/ /tmp/blooh
cd /tmp/blooh
git reflog expire --expire=now --all
git repack -ad
git gc --prune=now
前のソリューションにより、リポジトリのサイズは約100 MBでした。この1は1.7メガバイトにそれをもたらしました。多分それは誰かを支援します。)
<時間>次のbashスクリプトは、タスクを自動化します:
!/bin/bash
if (( $# < 3 ))
then
echo "Usage: $0 </path/to/repo/> <directory/to/extract/> <newName>"
echo
echo "Example: $0 /Projects/42.git first/answer/ firstAnswer"
exit 1
fi
clone=/tmp/${3}Clone
newN=/tmp/${3}
git clone --no-hardlinks file://$1 ${clone}
cd ${clone}
git filter-branch --subdirectory-filter $2 --prune-empty --tag-name-filter cat -- --all
git clone file://${clone} ${newN}
cd ${newN}
git reflog expire --expire=now --all
git repack -ad
git gc --prune=now
これはもはやあなただけ gitのフィルタ分岐を使用することができますので、複雑ではありません>あなたはしたくないサブディレクトリを淘汰し、新しいリモートにプッシュするレポのクローンでコマンドます。
git filter-branch --prune-empty --subdirectory-filter <YOUR_SUBDIR_TO_KEEP> master
git push <MY_NEW_REMOTE_URL> -f .
の の更新:gitの-サブツリーモジュールはgitのチームがコアにそれを引っ張り、それがgit subtree
行われるように有用でした。ここを参照してください:別のGitのリポジトリのにデタッチ(移動)サブディレクトリを
のgit-サブツリーは、このために有用であり得る
http://github.com/apenwarr/git -subtree / BLOB /マスタ/ gitの-subtree.txt の(非推奨)
ます。http:// psionides.jogger.pl/2010/02/04/sharing-code-between-projects-with-git-subtree/する
こちらは小さな変更 CoolAJ86's "The Easy Way™"の回答 のための分割 複数のサブフォルダ (たとえば sub1
や sub2
)新しいgitリポジトリ
の簡単、ファイルを本機にコピー複数のサブフォルダ)
準備のレポ
pushd <big-repo> git filter-branch --tree-filter "mkdir <name-of-folder>; mv <sub1> <sub2> <name-of-folder>/" HEAD git subtree split -P <name-of-folder> -b <name-of-new-branch> popd
注意:
<name-of-folder>
などを含めないでください先頭または末尾文字です。例えば、フォルダの名前subproject
重要なことを報告し、必要に応としてsubproject
, ない./subproject/
注意windowsユーザ: 時にフォルダの深さは>1,
<name-of-folder>
は*nixスタイルのフォルダ区切り文字(/).例えば、フォルダの名前path1\path2\subproject
重要なことを報告し、必要に応としてpath1/path2/subproject
.また利用がないmv
コマンドがmove
.【注意事項】 独特の大きな違いは、ベースの答えは次のスクリプト"
git filter-branch...
"新しいレポ
mkdir <new-repo> pushd <new-repo> git init git pull </path/to/big-repo> <name-of-new-branch>
リンクを新しいレポ-レートをGithubはどこまも
git remote add origin <git@github.com:my-user/new-repo.git> git push origin -u master
浄化 希望の場合
popd # get out of <new-repo> pushd <big-repo> git rm -rf <name-of-folder>
注意:この歴史的文献のリポジトリを参照 付録 の答えば実際に懸念を有する取組方針当社グループパスワードが必要減少のファイルサイズの
.git
フォルダにまとめた。
元の質問には、XYZ / ABC /(*ファイル)ABC / ABC /(*ファイル)になることを望んでいます。私自身のコードの受け入れ答えを実装した後、私はそれが実際にABC /(*ファイル)にXYZ / ABC /(*ファイル)を変更することに気づきました。フィルタ分岐のmanページも、
、言います結果は、そのディレクトリが含まれています(とそれだけで)のそのプロジェクトのルートとしての。」
言い換えれば、それは1つのレベル「アップ」最上位のフォルダを推進しています。例えば、私の歴史の中で、私は最上位のフォルダの名前を変更していた、ので、それは重要な区別です。 1つのレベル「アップ」フォルダを推進することで、gitのは、私が名前の変更をしたところコミット時に連続性が失われます。
質問に対する私の答えは、リポジトリの2つのコピーを作成し、手動でそれぞれに維持したいフォルダを削除することです。 manページには、これで私をバックアップします:
[...] [次のコマンド]を使用しないようであれば、単純な単一あなたの問題を解決するために十分であろうコミット
ポールの答えをhref="https://stackoverflow.com/a/359759/42473">
すなわちます。 GCのプルーンの後に、またやるます: 次に、あなたが行うことができます。 及びABC / .gitのサイズを小さくする 実際には、いくつかの(例えばgitのGC)は、リポジトリ、すなわちをきれいにプッシュで必要とされない:$ mkdir ...ABC.git
$ cd ...ABC.git
$ git init --bare
$ git push ...ABC.git HEAD
$ git clone ...ABC.git
$ git clone --no-hardlinks /XYZ /ABC
$ git filter-branch --subdirectory-filter ABC HEAD
$ git reset --hard
$ git push ...ABC.git HEAD
適切な在は次の通りです:
git filter-branch --prune-empty --subdirectory-filter FOLDER_NAME [first_branch] [another_branch]
GitHub、もって 小さな条 いるようである。
ずにクローンのオリジナルのレポ-レート別ディレクトリ初とで削除しているため、すべてのファイルやディレクトリおよびご確って動作する必要がありました。
なおアルゴリズムをとるとき
- クローンのリモーレポを別のディレクトリ
- を使用
git filter-branch
左ファイルのみがサブディレクトリ、新しいリモート - 作為にサブディレクトリのからオリジナルのリモートオペ
うになる(?) の答えがここに頼るもの git filter-branch --subdirectory-filter
そのご応募.この場"ほとんどの時代"とした場合、インスタンスの場合だと改称のフォルダのex:
ABC/
/move_this_dir # did some work here, then renamed it to
ABC/
/move_this_dir_renamed
う場合通常のgitフィルタースタイルの抽出"move_me_renamed"のまま据え置かれてファイルの歴史を変えることが明らかとなった時でしたmove_this_dir(ref).
このように表示されるので本当にい すべての 変更履歴がある場合このように、日本の機関リポジトリを新規作成レポ-レートを設定することが知られ由来)、そして劇他のすべてに、名前の変更、サブディレクトリの親のようになります:
- クローンマルチモジュール-プロジェクトの現地
- 支店-チェックに何もコメントありがとうございます
git branch -a
- い精算を各支店に分割にコピーをごワークステーション:
git checkout --track origin/branchABC
- コピーしたディレクトリ:
cp -r oldmultimod simple
- の新しいプロジェクトのコピー:
cd simple
- なく他のモジュールなめこのプロジェクト:
git rm otherModule1 other2 other3
- 今だけのsubdirの対象のモジュールは
- くのモジュールsubdirのモジュールのルートが新しいプロジェクトルート
git mv moduleSubdir1/* .
- 削除の名残subdir:
rmdir moduleSubdir1
- チェック変更点:
git status
- 同時に、新たにgitレポピースの最新サイト運営術"にてポイントこのプロジェクトで
git remote set-url origin http://mygithost:8080/git/our-splitted-module-repo
- を検証す:
git remote -v
- を押して、変化までのリモートレポ-レート:
git push
- のリモートレポ-レートやチェックでも最高にカッコいい一枚だ
- 繰り返し、それ以外の支店:
git checkout branch2
これは以 のgithubのdocフレーバ"分割、サブフォルダとして提出してください新しいリポジトリ" テ6-11押しのモジュールを新しい呼ぶ。
このことはできずにおります。gitのフォルダで保存すべての変更履歴のためにこれらのファイルを横断しに変更.とく変わることができるはずである場合はありません"く"の歴史を失った。しかし、少なくともす保証に失わない高齢犯!
私は、まさにこの問題を抱えていたが、gitのフィルタ分岐に基づいて、すべての標準的なソリューションは非常に遅かったです。あなたは小さなリポジトリを持っている場合、これは問題ではないかもしれないが、それは私のためでした。私は、最初のステップとして、プライマリ・リポジトリの各フィルタリングのためのブランチを作成し、次のステップとして、リポジトリをきれいにするためにこれらをプッシュlibgit2に基づいて別のGitのフィルタリングプログラムを書きました。私のリポジトリ(500MB 100000のコミット)には、標準的なgitのフィルタ分岐方法は日数を要しました。私のプログラムは、同じフィルタリングを行うには数分かかります。
ここはgit_filterと生活の素晴らしい名前を持っています:
https://github.com/slobobaby/git_filterする
GitHubの上ます。
私はそれが誰かに便利です願っています。
そのようなのでこちらをどのようGitHubのレコード機です。いてクローニングレポ-レートに住 C:\dir1
.ディレクトリの構造は以下のようなものです: C:\dir1\dir2\dir3
.の dir3
ディレクトリの一つになりたいので、また新たに別の呼ぶ。
Github:
- 作成した新しいリポジトリ:
MyTeam/mynewrepo
Bashの迅速:
$ cd c:/Dir1
$ git filter-branch --prune-empty --subdirectory-filter dir2/dir3 HEAD
返される:Ref 'refs/heads/master' was rewritten
(参考:dir2/dir3が必要になる場合があります。)$ git remote add some_name git@github.com:MyTeam/mynewrepo.git
git remote add origin etc
.なかった作品は返却"remote origin already exists
"$ git push --progress some_name master
としてい 上記の, また使用しリバース-ソリューション(すべて削除する為の手を触れずに私 dir/subdir/targetdir
るたほどに、かなり良く除去約95%の犯(任意).が、しかし、二つの小さな問題が残っている。
第, filter-branch
したガンマ線バーストup仕事の削除を犯した変更コードがどうやら、 統合する為の は下にその駅をGitiverse.
この化粧品問題をできるだろうと暮らす (言...バ離れでゆっくりと目を回避).
第 にする為に残るん すべての 重複!い取得した、冗長タイムラインに至るだけで全体の歴史がある。面白いこと(これからご覧いただけます)は、したが、現地支店のはすべて同じタイムラインは、確かにいるだけではないゴミ収集した).
しかし、面白いことなので、削除を犯したが、おそらく、単一の統合コミットする filter-branch
実際に削除した, これに並列にタイムラインそれぞれ現在の内にマージされていないストランドした独自のコピーを設定します。(悩 が私のTARDiS?) またまた固定でき、この問題のもっ 本当に 愛のかそうです。
の場合はクレイジmergefest-O-RAMAんがすことができるだけでしっかり定着そのもの私のコミットの歴史—威嚇に残って来の近接するものではありませんように実際に生体-化粧品の問題ではない方々にメッセージをタワーがあります。アプリです。
、サブディレクトリを削除するには、このフィルタコマンドを使用します:
git filter-branch --index-filter \
"git rm -r -f --cached --ignore-unmatch DIR" --prune-empty \
--tag-name-filter cat -- --all
に大きく
- 設置
git splits
.作成したとしてもgitの拡張に基づき、 jkeatingソリューション. 分割のディレクトリへの地方支店
#change into your repo's directory cd /path/to/repo #checkout the branch git checkout XYZ
#split multiple directories into new branch XYZ git splits -b XYZ XY1 XY2を空のレポどこかということです。まとまった空のレポ-レートと呼ばれ
xyz
GitHubとパス:git@github.com:simpliwp/xyz.git
押しの新しい呼ぶ。
#add a new remote origin for the empty repo so we can push to the empty repo on GitHub git remote add origin_xyz git@github.com:simpliwp/xyz.git #push the branch to the empty repo's master branch git push origin_xyz XYZ:master
クローンの新規作成されたリモートレポ-レートを新しいローカルのディレクトリを表示
#change current directory out of the old repo cd /path/to/where/you/want/the/new/local/repo #clone the remote repo you just pushed to git clone git@github.com:simpliwp/xyz.git
私のおすすめ GitHubのガイド分割のサブフォルダを新しいリポジトリ.ステップについては類似 ポール応答, も、その指示に分かりやすいものになりました。
修の指示のように申請するローカルリポジトリでなく、開催GitHub.
分割をサブフォルダとして提出してください新しいリポジトリ
開Git Bash.
変更の現在の作業ディレクトリの場所を作りたい新しいリポジトリ
クローンをリポジトリが含まれるサブフォルダ.
git clone OLD-REPOSITORY-FOLDER NEW-REPOSITORY-FOLDER
- 変更の現在の作業ディレクトリをクローニングできます。
cd REPOSITORY-NAME
- フィルターのサブフォルダからファイルのリポジトリ、
git filter-branch
, 提供これらの情報:
FOLDER-NAME
:フォルダ内のプロジェクトといを作り分リポジトリです。
- ヒント:Windowsユーザーの利用
/
に境界を定フォルダの中に別のフォルダを作BRANCH-NAME
:デフォルトの支店の現在のプロジェクトは、例えば、master
またはgh-pages
.git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME # Filter the specified branch in your directory and remove empty commits Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89) Ref 'refs/heads/BRANCH-NAME' was rewritten
あなたは、実際にファイルを一掃するために、ガベージコレクションの前に「--all今--expire =を期限切れREFLOG gitの」のようなものが必要になる場合があります。 gitのフィルタ分岐はただの歴史の中での参照を削除しますが、データを保持REFLOGエントリを削除しません。もちろん、最初にこれをテストします。
私の最初の条件は多少異なっていたものの、私のディスク使用量は、これを行うことで劇的に低下しました。おそらく--subdirectory-フィルタはこの必要性を否定したが、私はそれを疑うます。
https://github.com/vangorra/git_splitする
でgit_splitプロジェクトをチェックアウト自分の場所で非常に独自のリポジトリにgitのディレクトリを回します。いいえサブツリー面白いビジネスません。このスクリプトは、あなたのgitリポジトリ内の既存のディレクトリを取ると、独自の独立したリポジトリにそのディレクトリをオンにします。道に沿って、それはあなたが提供するディレクトリの全体の変更履歴をコピーします。
./git_split.sh <src_repo> <src_branch> <relative_dir_path> <dest_repo>
src_repo - The source repo to pull from.
src_branch - The branch of the source repo to pull from. (usually master)
relative_dir_path - Relative path of the directory in the source repo to split.
dest_repo - The repo to push to.
あなたのgitconfigにこれを入れます:
reduce-to-subfolder = !sh -c 'git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter cookbooks/unicorn HEAD && git reset --hard && git for-each-ref refs/original/ | cut -f 2 | xargs -n 1 git update-ref -d && git reflog expire --expire=now --all && git gc --aggressive --prune=now && git remote rm origin'
私はGitのサブツリーがすべての罰金と素晴らしいです確信しているが、gitの私のサブディレクトリは、私が移動したいコードは全て日食にあった管理しました。 あなたがegitを使用しているのであれば、それは痛いほど簡単です。 あなたはそれDISCONNECTとteam->を移動したいプロジェクトを取り、その後、team->新しい場所にそれを共有します。それは昔のレポの場所を使用しようとしているにデフォルト設定されますが、あなたは利用-既存の選択をオフにして、それを移動するための新しい場所を選ぶことができます。 すべての雹のegitます。
私はかなりまっすぐ進む解決策を見つけました、 アイデアは、リポジトリをコピーして、ちょうど不要な部分を削除することです。 これは、それがどのように動作するかです。
1)リポジトリのクローンを作成しますが、分割したいと思います。
git clone git@git.thehost.io:testrepo/test.git
2)のgitフォルダに移動
cd test/
2)不要なフォルダを削除し、それをコミット
rm -r ABC/
git add .
enter code here
git commit -m 'Remove ABC'
3) BFG ので不要なフォルダ(S)体の履歴を削除しますP>
cd ..
java -jar bfg.jar --delete-folders "{ABC}" test
cd test/
git reflog expire --expire=now --all && git gc --prune=now --aggressive
乗算フォルダのカンマを使用することができます。
java -jar bfg.jar --delete-folders "{ABC1,ABC2}" metric.git
4)歴史は、
あなただけ削除したファイル/フォルダが含まれていないことを確認してくださいgit log --diff-filter=D --summary | grep delete
5)今、あなたは、ABCないクリーンなリポジトリを持っています これだけ新しい原点に押し込み
remote add origin git@github.com:username/new_repo
git push -u origin master
それはそれです。あなたが別のリポジトリを取得するための手順を繰り返すことができ、
ちょうどXY1、XY2を削除し、XYZの名前を変更 - >ステップ3のABC
このためでした。の問題っていないときの手順※記載されている
このコマンド
git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME
のBRANCH-NAME
は マスター場合、または最後のステップに失敗した場合犯による保護の問題フォロー https://docs.gitlab.com/ee/user/project/protected_branches.html