LoginSignup
15
21

More than 5 years have passed since last update.

gitのリポジトリ構造を変更するための予備知識まとめ

Last updated at Posted at 2016-02-10

わからないこと、やりたいこと

  • ローカルリポジトリのroot階層を変え、正規のリポジトリに反映する
  • SVNから取り出す→svnのcloneブランチ作成->ローカルリポジトリ上で階層やリポジトリの区切きれいにする->リモートリポジトリを設定->リモートリポジトリへプッシュ

ローカルリポジトリのroot階層を変え、正規のリポジトリに反映する

適当にローカルgit作って、なんか実現できそうになってから本物gitの管理下に入れたい.
けど、散らかっている、別々のローカルgitになっている状態がスタート。

こーなっているものを

project-rest
  |-folderA
  |-folderB
  |-.git

こーする

project-server
  |-.git
  |-  project-rest
        |-folderA
        |-folderB

A案
rootフォルダ名を「project-server」にリネームして
「project-rest」フォルダを作成して「folderA」「folderB」を移動する?

B案
「project-server」というgitリポジトリをinitして
「project-rest」ローカルリポジトリをmergeする?

B案の方が簡単そう、かつ正しそうなので、やってみた。
NGの例

git clone /C/pleiades/workspace/examples/project-rest

コマンドは成功
…でもログを確認できない。形も違う

ちゃんと理解できてないまま、やろうとしてもやっぱりできないダメな例。

うまくいった手順

cd project-server
# サブディレクトリ「project-rest」を作成
mkdir project-rest
# 空ディレクトリはコミットできないのでお作法に従いファイル作成
touch project-rest/.gitkeep
# gitのindexへフォルダ追加
$git add -A project-rest
# コミット
$git commit -m "コメント"

# リモートリポジトリ名「project-rest」を設定。設定先のパスは自分用ローカルリポジトリ
$git remote add project-rest /path/to/the/project-rest
# 設定を確認してみる
$git remote -v
  origin …(中略)
  project-rest /path/to/the/project-rest(fetch)
  project-rest /path/to/the/project-rest(push)

# リモートリポジトリ(という定義の移行元ローカル「project-rest」の情報をfetch)
$git fetch project-rest
# fetchして持ってきたproject-restリポジトリのdevブランチをproject-restフォルダにマージ
$git merge -X subtree=project-rest project-rest/dev
# ログ履歴が反映されたか確認
$git log

ここまでやりきったら「origin」にプッシュしてOK

但し、本例はwindowsのパス構成でローカルリポジトリの履歴を積み上げてしまっている。

細かくリポジトリのファイル情報を追跡していくと
「指定されたパスの情報が取得できませんでした。ファイル名もしくはフォルダ名には UTF-8 を利用してください。」
という、気持ーちダメな感じになってしまった。

pushする手前の段階で、「filter-branch」で履歴を書き換える必要があったのかもしれない。

SVNから取り出す→svnのcloneブランチ作成->ローカルリポジトリ上できれいにする->リモートリポジトリを設定->リモートリポジトリへプッシュ

今理解したことの応用で、svn相当のブランチを切りだしてマージする、という手順でまとめていく。
旧リポジトリの階層構造から、一部だけ抜き出したブランチをマージ。
必要に応じ、ブランチの履歴を「filter-branch」で書き換える。
という感じで、やりながら書いていく。

はまったこと

Subversionリポジトリの一部をfilter-branchしたdumpを取る手順→サーバに直接入れずdumpが取れない、依頼してもやってくれない。など。

やったこと

どこにあるものでも良いから最新とリビジョンの履歴をコピーしたgit masterブランチを作成する。

先に整理しておく情報
No 対象 パスの例
1 Subversionリポジトリのサブフォルダ https://host/svn/project/branches/sub-projectA
2 ローカルgitリポジトリ作成フォルダ sub-projectA
3 gitユーザ名 任意
4 gitユーザメール 任意
5 リモートgitリポジトリ https://xxx.backlog.jp/git/PRJ_1/sub-projectA.git
詳細な手順

注:subversionとgitユーザを関連づける場合は、[user.txt]を事前に作成します。

  • 任意のフォルダに移動し、gitローカルリポジトリを作成

    git svn clone ${1} ${2}
    git svn create-ignore
    
  • 作成したgitローカルリポジトリに移動

    cd {2}
    
  • git編集者を設定

    git config user.name ${3}
    git config user.email ${4}
    
  • svn-ignore設定をgitへ移行

    git svn create-ignore
    git commit -m "initial ignore commit"
    
  • リモートgitリポジトリへpush

    git remote add origin ${5}
    
    git push origin master
    

これだけで、履歴含め綺麗に移行できました!

(ここに至るまで、かなりの時間を要しましたが、最終的にはとある1日だけで劇的にスッキリした!という顛末でした。)

FYI

subversion管理しているプロジェクトのサブディレクトリをgithubに引っ越す
https://siguniang.wordpress.com/2014/02/09/migrate-svn-repository-to-github/

git - 簡単ガイド
http://rogerdudler.github.io/git-guide/index.ja.html

gitリポジトリの複製
http://qiita.com/syuji-higa@github/items/e380289502c7896daf0f

初心者向け

続続・イラストでわかるgit入門の入門:checkoutをする
http://blog.asial.co.jp/1026

git push origin master の意味は?

push = アップロード
origin = リモートのサーバ名
master = デフォルトのブランチ名 (svnでのtrunkと同じ)

ノウハウ集

コマンド

gitコマンドの基本的な使い方
http://qiita.com/wwacky/items/2f110ee76fc1cb681c3b
git cloneの使い方
http://transitive.info/article/git/command/clone/

移行

履歴を残したまま複数のgitリポジトリを統合する
http://qiita.com/edvakf@github/items/9e7ccbaa944d26f9b69c

Git 別のリポジトリを履歴を残したまま取り込みたい(こっちの方が理解を深められた)
http://chaika.hatenablog.com/entry/2015/06/04/173401

Git で複数のリポジトリをまとめたり、逆に切り出したりする
http://qiita.com/uasi/items/77d41698630fef012f82

15
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
21