[Git] tag 操作

一個專案如果 commit 了 N 次,就算 commit message 寫得很完整,如果要很快的找到特定版本也是有點困難。

利用 git tag 幫 commit 加入標籤,操作上就更方便迅速。

# 列出所有標籤
git tag

# 新增一個標籤,名稱為 my-tag
git tag my-tag

# 如果要自訂註解,可以利用參數 -m,沒有加 -m 的話預設會以 HEAD (當前版本) commit message 為標籤的 message
git tag my-tag -m "My tag message."

# 如果要寫多行註解,可以利用參數 -a 開啟編輯器編寫
git tag -a my-tag

# 從指定標籤開一個新 branch
git branch new-branch my-tag

# 查看標籤詳細資料
git show my-tag

# 針對指定 commit 做標籤
git tag my-tag d3a0dcb

# push 指定標籤 (多個標籤以空白隔開)
git push origin my-tag

# push 所有 tag
git push --tags

# 刪除本機端指定標籤 (多個標籤以空白隔開)
git tag -d my-tag

# 刪除本機端所有標籤
git tag | xargs git tag -d

# 刪除遠端指定標籤 (多個標籤以空白隔開,但是每個標籤前面都要加上 :refs/tags/)
git push origin :refs/tags/my-tag

 

有關 Tag update:

在更新本機標籤時需要使用 git fetch,而不是 git pull

git remote update 雖然會把新的標籤拉下來

但是若兩端皆存在相同名稱的標籤,且遠端版本較新時

git remote update 並不會更新本機標籤

由於標籤和 branch 性質不相同,如果要更新標籤,需要在強制模式 (參數 --force) 下執行 (除了 fetch)

以下為更新標籤的操作方式

# 覆寫標籤 (以當前 branch 最後一次的 commit 寫入)
git tag -f my-tag

# 覆寫遠端指定標籤 (多個標籤以空白隔開)
git push -f --follow-tags origin my-tag

# 覆寫遠端所有標籤 (本機端不存在的標籤不會覆寫上去)
git push -f --tags

# 從遠端覆寫本機端所有標籤 (遠端不存在的標籤不會被覆寫)
git fetch --tags

 

為標籤重新命名:

Git 本身並沒有辦法讓標籤直接重新命名

因此需要用建立新標籤 + 移除舊標籤的方式達成

# 使用 old-tag 的 commit 建立新標籤 new-tag
git tag new-tag old-tag

# 刪除本機端舊標籤
git tag -d old-tag

# 刪除遠端舊標籤
git push origin :refs/tags/old-tag

# 上傳新標籤
git push origin new-tag

 

如果專案有多人協作

請通知你的夥伴們執行 git pull --prune --tags

否則舊標籤仍然會存在於他們的電腦上

且他們在 push 時就很有可能又把舊標籤 push 上去


Reference: git tag – How do you rename a Git tag? – Stack Overflow

[Git] Gitolite install

利用apt-get安裝(已安裝git-core時可不用鍵入git-core):

>sudo apt-get install git-core gitolite

 

建立gitolite的系統使用者帳號:

>sudo adduser --system --group --shell /bin//bash --disabled-password git

 

如果沒有ssh-key,需產生一組來使用,並且複製一份到git的家目錄,供稍後安裝使用(為了區分各種key,將id_rsa.pub更名)

ssh-keygen -t rsa -C "account@example.org"
sudo cp .ssh/id_rsa.pub /home/git
sudo mv /home/git/id_rsa.pub /home/git/calos.pub
sudo chmod 777 /home/git/calos.pub

 

切換帳號到git

>sudo su - git

 

使用gl-setup進行安裝,此動作需要匯入管理者的ssh-key

>gl-setup ./calos.pub

 

gitolite是利用git repository的模式下去管理專案與使用者,第一次設定專案或使用者時需clone gitolite-admin這個repository

>git clone git@gitolite-server-address:gitolite-admin.git

 

切換到gitolite-admin這個目錄時,可以看到底下有conf與keydir這兩個目錄

若要將他人加入到git的使用者,只需將他人的ssh-key複製一份到keydir這個目錄下,並git add

>cp /path/to/chuchu/id_rsa.pub ~/gitolite-admin/keydir/chuchu.pub
git add ~/gitolite-admin//keydir/chuchu.pub

 

建立專案與設定權限在conf/gitolite.conf這個檔案裡

>vim ~/gitolite-admin/conf/gitolite.conf
repo gitolite-admin
RW+ = calos
repo testing
RW+ @all

 

權限劃分如下:

R:只能讀取

RW:可覆寫或新增參照點

RW+:可強制覆寫(push -f)或刪除參照點

-:據絕存取
群組設定,在設定名稱前面加上「@」,後面可設定隸屬於該群組的User或Repository,下列為範例

># Users group
@group_1 Calos Chuchu
@group_2 KYKY Johnson
#Repositories group
@group_3 project_2 project_3
repo gitolite-admin
RW+  Calos
# 在project_1,Calos可強制覆寫參照,Chuchu可建立或刪除參照,Johnson與KYKY只可讀取
repo project_1
RW+  Calos
RW    @group_1
R       @group_2
# 在project_2與project_3,Johnson與KYKY可以強制覆寫參照,Calos與Chuchu只可讀取
repo @group_3
RW+ @group_2
R      @group_1

 

做任何更動後需push,才會生效

>git add ~/gitolite-admin/conf/gitolite.conf
git commit -m "Change gitolite config"

[MySQL] 字串取代與連接 (REPLACE、CONCAT)

取代字串:REPLACE(`欄位名稱`, '欲取代的字串', '取代後的字串')

# 將efg開頭的字串取代
UPDATE `table` SET `column` = REPLACE(`column`, 'efg', 'zzz') WHERE `column` LIKE 'efg%';
將efg結尾的字串取代
UPDATE `table` SET `column` = REPLACE(`column`, 'efg', 'zzz') WHERE `column` LIKE '%efg';
將欄位column_2含有efg字串取代成zzz,不過將取代後的結果覆寫於column_1,不更動column_2原有的內容
UPDATE `table` SET `column_1` = REPLACE(`column_2`, 'efg', 'zzz') WHERE `column_2` LIKE '%efg%';

 

連接字串:CONCAT('字串1', '字串2', ... '字串n')

# 於column值為456的資料行首插入字串123
UPDATE `table` SET `column` = CONCAT('123', `column`) WHERE `column`='456';
(Result: 123456)
# 於column值為456的資料行尾插入字串123
UPDATE `table` SET `column` = CONCAT(`column`, '123') WHERE `column`='456';
(Result: 456123)
# 於column值為456的資料行首插入字串123,行尾插入789
UPDATE `table` SET `column` = CONCAT('123', `column`, '789') WHERE `column`='456';
(Result: 123456789)
於column值為456的資料行首行尾各插入原值,使其值為重覆三次的字串
UPDATE `table` SET `column` = CONCAT(`column`, `column`, `column`) WHERE `column`='456';
(Result: 456456456)

 

[MySQL] root密碼重設

如果忘記root密碼可以這樣重設

 

停止服務

# sudo /usr/local/etc/rc.d/mysql-server stop

 

以安全模式啟動mysql,並跳過檢查

# sudo mysqld_safe --skip-grant-tables

 

這時候登入不需要密碼

# mysql -u root

 

接著修改DB記錄,把root密碼設成123456,並重新載入權限

mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD("123456") WHERE User='root';
mysql> flush privileges;
mysql> exit

 

最後重新啟動MySQL,大功告成

# sudo /usr/local/etc/rc.d/mysql-server restart