質問

してい Git リポジトリを含む複数のサブディレクトリ.現在、このサブディレクトリとは関係のない部分ですがその他のやるべき一戸建ての個別のリポジトリ

する方法を教えてくださいこの歴史のファイル内のサブディレクトリ?

って終わってしまったクローンを取り外し不要な部品の各クローンが思うの完全ツリー時チェックアウトの古い修正など。これでも良いでしょうが、私の好きな振りのリポジトリがないのに共有します。

だけでは明らかで、私は以下のような構造をとります:

XYZ/
    .git/
    XY1/
    ABC/
    XY2/

いつづけたいと思っていますこの替り:

XYZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/
役に立ちましたか?

解決

更新:このプロセスは共通のgitのチームでより簡単な新しいツール git subtree.こちらをご参照: 取り外し(移動)サブディレクトリを別Gitリポジトリ


したいクローンポートおよびその利用 git filter-branch をマークすべてのサブディレクトリのない新しいレポするごみを収集します。

  1. ローカルリポジトリ:

    git clone /XYZ /ABC
    

    (注:のリポジトリがクローニング用のハードリンク、それは問題ではありませんから、ハード-サファイルは変更されることはありませんで自分たちで新しいものを作成します。)

  2. 現在、保全の面白い店舗いて書き換えとして、取り外してくださの原点を回避を押してある古いを犯しない植物の自家不和合性遺伝子機能の原点:

    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
    
  3. 現するために取り外しもタグを持つのサブテーマ;きもとで入手できるかもしれませんが、必要なプルーンにおrepoます。なかったことのないようん WARNING: Ref 'refs/tags/v0.1' is unchanged すべてのタグ以降に大いに関係のないサブテーマ);また、を取り除いた後などのタグスペースが再生.どうやら git filter-branch できる書き換えその他のタグも確認を行っておりません。除する場合には全てのタグを使用 git tag -l | xargs git tag -d.

  4. し使用フィルター-支店およびリセットを含みますし、それらのファイルにすることが可能ですので、剪定.ましょうも追加 --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
    
  5. 削除し、バックアップ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.もよりますが、 実例ウォークスルー ます。

  1. 準備のレポ

    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

  2. 新しいレポ

    mkdir <new-repo>
    pushd <new-repo>
    
    git init
    git pull </path/to/big-repo> <name-of-new-branch>
    
  3. リンクを新しいレポ-レートをGithubはどこまも

    git remote add origin <git@github.com:my-user/new-repo.git>
    git push origin -u master
    
  4. 浄化 希望の場合

    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, .gitignoreLICENSE, る必要がありま引先:

git pull origin -u master
git push origin -u master

最後に、私がしたい削除フォルダからの大きなレポ

git rm -rf btoa

...

付録

最新のgit OS X

の最新バージョンのgit:

brew install git

を醸し出OS X:

http://brew.sh

最新の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 ます。

  1. のクローンのフィルタ:

    git clone --no-hardlinks foo bar; cd bar
    git filter-branch --subdirectory-filter subdir/you/want
    
  2. 削除毎の歴史"原点"のつのクローンは、"オリジナル"ではフィルター-支店に保存する古いもの:

    git remote rm origin
    git update-ref -d refs/original/refs/heads/master
    git reflog expire --expire=now --all
    
  3. 現在でも、歴史が詰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™"の回答 のための分割 複数のサブフォルダ (たとえば sub1sub2)新しいgitリポジトリ

の簡単、ファイルを本機にコピー複数のサブフォルダ)

  1. 準備のレポ

    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..."

  2. 新しいレポ

    mkdir <new-repo>
    pushd <new-repo>
    
    git init
    git pull </path/to/big-repo> <name-of-new-branch>
    
  3. リンクを新しいレポ-レートをGithubはどこまも

    git remote add origin <git@github.com:my-user/new-repo.git>
    git push origin -u master
    
  4. 浄化 希望の場合

    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のは、私が名前の変更をしたところコミット時に連続性が失われます。

私はフィルタ分岐後contiuityを失った

質問に対する私の答えは、リポジトリの2つのコピーを作成し、手動でそれぞれに維持したいフォルダを削除することです。 manページには、これで私をバックアップします:

  

[...] [次のコマンド]を使用しないようであれば、単純な単一あなたの問題を解決するために十分であろうコミット

ポールの答えをhref="https://stackoverflow.com/a/359759/42473">

すなわちます。

$ mkdir ...ABC.git
$ cd ...ABC.git
$ git init --bare

GCのプルーンの後に、またやるます:

$ git push ...ABC.git HEAD

次に、あなたが行うことができます。

$ git clone ...ABC.git

及びABC / .gitのサイズを小さくする

ステップを消費時間の

実際には、いくつかの(例えばgitのGC)は、リポジトリ、すなわちをきれいにプッシュで必要とされない:

$ 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、もって 小さな条 いるようである。

ずにクローンのオリジナルのレポ-レート別ディレクトリ初とで削除しているため、すべてのファイルやディレクトリおよびご確って動作する必要がありました。

なおアルゴリズムをとるとき

  1. クローンのリモーレポを別のディレクトリ
  2. を使用 git filter-branch 左ファイルのみがサブディレクトリ、新しいリモート
  3. 作為にサブディレクトリのからオリジナルのリモートオペ

うになる(?) の答えがここに頼るもの 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).

このように表示されるので本当にい すべての 変更履歴がある場合このように、日本の機関リポジトリを新規作成レポ-レートを設定することが知られ由来)、そして劇他のすべてに、名前の変更、サブディレクトリの親のようになります:

  1. クローンマルチモジュール-プロジェクトの現地
  2. 支店-チェックに何もコメントありがとうございます git branch -a
  3. い精算を各支店に分割にコピーをごワークステーション: git checkout --track origin/branchABC
  4. コピーしたディレクトリ: cp -r oldmultimod simple
  5. の新しいプロジェクトのコピー: cd simple
  6. なく他のモジュールなめこのプロジェクト:
  7. git rm otherModule1 other2 other3
  8. 今だけのsubdirの対象のモジュールは
  9. くのモジュールsubdirのモジュールのルートが新しいプロジェクトルート
  10. git mv moduleSubdir1/* .
  11. 削除の名残subdir: rmdir moduleSubdir1
  12. チェック変更点: git status
  13. 同時に、新たにgitレポピースの最新サイト運営術"にてポイントこのプロジェクトで
  14. git remote set-url origin http://mygithost:8080/git/our-splitted-module-repo
  15. を検証す: git remote -v
  16. を押して、変化までのリモートレポ-レート: git push
  17. のリモートレポ-レートやチェックでも最高にカッコいい一枚だ
  18. 繰り返し、それ以外の支店: 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:

  1. 作成した新しいリポジトリ: MyTeam/mynewrepo

Bashの迅速:

  1. $ cd c:/Dir1
  2. $ git filter-branch --prune-empty --subdirectory-filter dir2/dir3 HEAD
    返される: Ref 'refs/heads/master' was rewritten (参考:dir2/dir3が必要になる場合があります。)

  3. $ git remote add some_name git@github.com:MyTeam/mynewrepo.git
    git remote add origin etc.なかった作品は返却"remote origin already exists"

  4. $ 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

に大きく

  1. 設置 git splits.作成したとしてもgitの拡張に基づき、 jkeatingソリューション.
  2. 分割のディレクトリへの地方支店 #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

  3. を空のレポどこかということです。まとまった空のレポ-レートと呼ばれ xyz GitHubとパス: git@github.com:simpliwp/xyz.git

  4. 押しの新しい呼ぶ。 #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

  5. クローンの新規作成されたリモートレポ-レートを新しいローカルのディレクトリを表示
    #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.


分割をサブフォルダとして提出してください新しいリポジトリ

  1. 開Git Bash.

  2. 変更の現在の作業ディレクトリの場所を作りたい新しいリポジトリ

  3. クローンをリポジトリが含まれるサブフォルダ.

git clone OLD-REPOSITORY-FOLDER NEW-REPOSITORY-FOLDER
  1. 変更の現在の作業ディレクトリをクローニングできます。

cd REPOSITORY-NAME
  1. フィルターのサブフォルダからファイルのリポジトリ、 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

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

簡単に https://help.github.com/enterprise/2.15/user/articles/splitting-a-subfolder-out-into-a-new-repository/

このためでした。の問題っていないときの手順※記載されている

  1. このコマンド git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAMEBRANCH-NAMEマスター

  2. 場合、または最後のステップに失敗した場合犯による保護の問題フォロー https://docs.gitlab.com/ee/user/project/protected_branches.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top