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

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

* ローカルリポジトリの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
    ```

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

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


## 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