2018/09/27
分離 git repository 中某個資料夾並獨立為一個 repository
由於歷史因素, 公司以前只開一個 repository, 用資料夾分不同的 applications
然後現在要導入自動化, 總不能每次都下載那一大包 source code 吧
所以想辦法看有沒有可以把某個資料夾獨立成一個 repository 並且 commit log 都可以保留的辦法
當然, 我可以把該資料夾手動複製然後創立新的 repository 並且 commit 上去
但是這樣就會遺失過往的 commit log
於似乎找了一下有沒有其他方法
git 這麼神, 當然有
1. 先建立好要獨立的 repository, 以 bitbucket 為例 git@bitbucket.org:user/sub-folder-project1
2. 下載原先大 repository, 並切換到要分離的資料夾的上層目錄
```shell
$ git clone git@bitbucket.org:user/huge-project
$ cd huge-project/path/to/sub-folder-project1
$ cd ..
```
3. 開始執行 git 指令分開 sub-folder-project1
```shell
# git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME
$ git filter-branch --prune-empty --subdirectory-filter sub-folder-project1 develop
```
4. 將分離出來的 sub-folder-project1 加上遠端資訊並且 push
```shell
$ git remote add subproject1 git@bitbucket.org:user/sub-folder-project1
$ git push -u origin develop
```
這樣就大功告成了啊~~
不過原本的 huge-project 的 develop 就會因此而亂掉, 若還需要繼續使用的話, 建議砍掉重新 clone 一份
參考: [https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/](https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/)
2016/04/29
git 如何移除本地端中 remote 已不存在的 branch
常常我們合併了一個 branch 出去之後必須把該 branch 關掉
通常 git server 都可以在網頁上操作關閉該 branch
可是你的 local 並不會自動移除該 remote branch,所以你下 git remote -a 時就會有一堆你曾經 checkout 過的 branch
可以下
```
git remote prune "你要同步的 remote"
```
他就會把 remote 上不存在的分支從你的本地端移除囉
2016/04/27
git 好用的 alias
紀錄一下 git 好用的 alias
```
[alias]
co = checkout
ci = commit
di = diff --ignore-space-change --ignore-space-at-eol
st = status -sb
br = branch -v
rt = reset --hard
unstage = reset HEAD
uncommit = reset --soft HEAD^
l = log --pretty=oneline --abbrev-commit --graph --decorate
lg = "log --color --graph --oneline --decorate --pretty=format:'%C(auto)%h%Creset%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
amend = commit --amend
who = shortlog -n -s --no-merges
g = grep -n --color -E
cp = cherry-pick -x
nb = checkout -b
# 'git add -u' handles deleted files, but not new files
# 'git add .' handles any current and new files, but not deleted
# 'git addall' now handles all changes
addall = !sh -c 'git add . && git add -u'
# Handy shortcuts for rebasing
rc = rebase --continue
rs = rebase --skip
ra = rebase --abort
ri = rebase --interactive
logf = log --follow
purge = clean -d -f -x
head = !sh -c 'git clean -d -f -x && git reset --hard HEAD'
```
2015/03/06
在ubuntu安裝最新版的git
以下指令在 ubuntu 14.04 / 12.04 測試過
目前最新版本是 git 2.3.1 (2015/03/06)
安裝步驟:
```
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
```
查看現在版本,已經變成2.3.1囉
```
moa@ubuntu:~/$ git --version
git version 2.3.1
```
2015/02/26
將別人的git repo加到自己repo底下的某個資料夾中
這標題實在很難下...
舉個例子來說
我原先有一個 repo git@github.com:moa/webserver.git
後來,我需要加入一些靜態網頁,但是又不想混在webserver這個repo裡
所以我建立了一個 git@github.com:moa/webpage.git
裡面只有放靜態網頁
現在,因為某些因素必須將 webpage.git 加到 webserver.git 的 static/webpage/ 資料夾下
首先我已經在webserver的repo裡了
指令如下
```
# 將webpage.git加到名為remotes/webpage/*
git remote add webpage git@github.moa/webpage.git
# 更新webpage.git到remotes/webpage/*
git fetch webpage
# 利用ours策略將remotes/webpage/master merge到所在branch
git merge -s ours --no-commit webpage/master
# 把webpage/master載到static/webpage/
git read-tree --prefix=static/webpage/ -u webpage/master
# 送交
git commit -m "Imported webpage.git to static/webpage/ as a subtree."
```
2015/01/21
重新命名 git branch
rename git branch
常常開了一個新分支後發現取名不夠好想修改
那麼該怎麼做呢
很簡單
第一個用法-要改所在分支的名字
1. 看一下改名前
```
$ git branch
* br_oldname 12345678 Branch to rename
master abcdef12 I am master
```
2. 改所在的br_oldname為br_newname
```
$ git branch -m br_newname
```
3. 修改結果
```
$ git branch
* br_newname 12345678 Branch to rename
master abcdef12 I am master
```
第二個用法-在其他branch要改其他branch的名字
1. 看一下改名前
```
$ git branch
* br_here 55661234 I am here
br_oldname 12345678 Branch to rename
master abcdef12 I am master
```
2. 改br_oldname為br_newname
```
$ git branch -m br_newname br_oldname
```
3. 修改結果
```
$ git branch
* br_here 55661234 I am here
br_newname 12345678 Branch to rename
master abcdef12 I am master
```
常常開了一個新分支後發現取名不夠好想修改
那麼該怎麼做呢
很簡單
第一個用法-要改所在分支的名字
1. 看一下改名前
```
$ git branch
* br_oldname 12345678 Branch to rename
master abcdef12 I am master
```
2. 改所在的br_oldname為br_newname
```
$ git branch -m br_newname
```
3. 修改結果
```
$ git branch
* br_newname 12345678 Branch to rename
master abcdef12 I am master
```
第二個用法-在其他branch要改其他branch的名字
1. 看一下改名前
```
$ git branch
* br_here 55661234 I am here
br_oldname 12345678 Branch to rename
master abcdef12 I am master
```
2. 改br_oldname為br_newname
```
$ git branch -m br_newname br_oldname
```
3. 修改結果
```
$ git branch
* br_here 55661234 I am here
br_newname 12345678 Branch to rename
master abcdef12 I am master
```
2014/11/03
送交(commit) git log 到svn repository
最近迷上了git,所以基本上只要修改或建立新的專案我都是建立git的repository
不過公司還是使用svn當作repository
那如果我想要把我在git上的commit log保留並且commit到svn那該怎麼辦呢?
當初從svn轉到git有用到一個套件"git-svn"
這次也是利用它來達成我的目標:
將git的log commit到svn上
首先 安裝它
環境:CentOS 5.9
```
yum install git-svn
```
利用git-svn 抓取svn source tree下來
```
git svn clone svn://moa.tw/my/svn/repository/more/folder/is/working ./svn2git
```
將原先存在的git repository新增為svn2git底下名為source的remote
```
cd svn2git/
git remote add -f source /moa/tw/git/repo/project
```
重新間接基準點到git-svn
```
git rebase --onto remotes/git-svn --root source/master
```
途中也許有衝突發生
```
Auto-merging view/base2.tmpl.html
CONFLICT (content): Merge conflict in view/base2.tmpl.html
Auto-merging view/base.tmpl.html
CONFLICT (content): Merge conflict in view/base.tmpl.html
Failed to merge in the changes.
```
修正後繼續即可
```
git add view/base2.tmpl.html
git add view/base.tmpl.html
git rebase --continue
```
之後就會看到一堆類似下面的訊息,也就是正在一筆一筆轉換
```
Applying: xxxxxxxxxxxxxxxxx
Applying: yyyyyyyyyyyyyyyyy
```
跑完之後執行
```
git svn dcommit
```
就會把log一併commit到svn repository了
接下來該探討的就是:
我是否可以繼續用git commit/push到git的repo,但是我想要commit回svn時,隨時都可以commit,而不怕source衝突
參考連結:
http://goodliffe.blogspot.tw/2011/08/pushing-git-repository-into-existing.html
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
```
2014/06/16
SVN 備份與還原
備份:
```
svnadmin dump /your/repo > repo.dump
```
搭配gz壓縮
```
svnadmin dump /your/repo | gz -9 repo.dump.gz
```
還原:
```
svnadmin load /your/repo/dest < repo.dump
```
```
svnadmin dump /your/repo > repo.dump
```
搭配gz壓縮
```
svnadmin dump /your/repo | gz -9 repo.dump.gz
```
還原:
```
svnadmin load /your/repo/dest < repo.dump
```
訂閱:
文章 (Atom)