2014/10/03

如何產生ssh key供git登入


以下如果要產生給github用的 ssh key

我習慣命名為github

```
ssh-keygen -t rsa -P '' -f ~/.ssh/github -C 'your@email5566.com'
```

這樣會在你的~/.ssh下建立兩個檔案
~/.ssh/github 與 ~/.ssh/github.pub

~/.ssh/github是私鑰要好好保存
~/.ssh/github.pub可以丟到github上

接著建立~/.ssh/config檔案,內容為

```
Host github.com
Hostname github.com
User git
Port 22
identityfile ~/.ssh/github
```

這樣在使用ssh連到github.com時他就會自己做認證了

如何做 “git export” (像 “svn export”)?



完成一個版本後想要發行

如果用git clone的話又會產生.git資料夾

以下提供如何做到像svn export一樣的功能

利用git archive
```
$ git archive -h
usage: git archive [options] <tree-ish> [<path>...]
or: git archive --list
or: git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]
or: git archive --remote <repo> [--exec <cmd>] --list

--format <fmt> archive format
--prefix <prefix> prepend prefix to each pathname in the archive
-o, --output <file> write the archive to this file
--worktree-attributes
read .gitattributes in working directory
-v, --verbose report archived files on stderr
-0 store only
-1 compress faster
-9 compress better

-l, --list list supported archive formats

--remote <repo> retrieve the archive from remote repository <repo>
--exec <cmd> path to the remote git-upload-archive command
```

使用方法1:
倒出master到某個資料夾

```
git archive master | tar -x -C /somewhere/else
```


使用方法2:
倒出master時加入參數直接打包壓縮
```
git archive --format tar.gz --output /full/path/to/zipfile.tgz master
```

2014/10/01

轉移 svn 到 git



最近公司開始導入 git

我也開始學了一下~ 覺得 git 實在很好用

所以要把自己的 svn server 改成 git

以下教學如何把 svn 移植到git

首先先將 svn 中原有使用者資訊給列出

```shell
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > ~/authors-transform.txt
```

再來用灌 git-svn 並執行:
```shell
git svn clone "你的 svn repo" --no-metadata -A ~/authors-transform.txt --no-minimize-url ~/temp
```

這樣~/temp就會是你的 repo 了,如果原先 repo 很雜亂,多個專案都使用同一個的話也沒問題。

再來把git專案push到git server上

```shell
git remote add origin git@bitbucket.org:yours.git
git push -u origin --all
```

完成

2015/02/03 補充

在轉換的 svn 中,空的資料夾會遺失
必須加上 --preserve-empty-dirs

```shell
git svn clone "你的 svn repo" --no-metadata --preserve-empty-dirs -A ~/authors-transform.txt --no-minimize-url ~/temp
```
官網說明:
--preserve-empty-dirs
Create a placeholder file in the local Git repository for each empty directory fetched from Subversion. This includes directories that become empty by removing all entries in the Subversion repository (but not the directory itself). The placeholder files are also tracked and removed when no longer necessary.

--placeholder-filename=<filename>
Set the name of placeholder files created by --preserve-empty-dirs. Default: ".gitignore"


2016/01/07 補充

若只想 clone 部分範圍的 commit 可已加上 -r "開始版號":"結束版號"

```shell
git svn clone -r 100:200 "你的 svn repo" --no-metadata --preserve-empty-dirs -A ~/authors-transform.txt --no-minimize-url ~/temp
```