星期二, 10月 18, 2011

php轉碼問題

利用iconv轉碼會有轉不回來的問題
可用mbstring來轉碼 就不會有問題了
當然apache要先安裝mbstring
  • 安裝
    yum install php-mbstring
  • big5轉utf8
    mb_convert_encoding($msg, "UTF-8", "BIG-5");
  • 配合自動偵測,統一轉utf8
    要注意要自己加上可能的碼,不然可能會找不到
    $encoding = mb_detect_encoding($this->content, "UTF-8,BIG-5,GB2312, ASCII, ISO-8859-1");
    $msg = mb_convert_encoding($msg, "UTF-8", $encoding);
    

星期四, 10月 13, 2011

php處理url函式

  • 組url字串
    利用http_build_query
    <?php
    $data = array('foo'=>'bar',
                  'baz'=>'boom',
                  'cow'=>'milk',
                  'php'=>'hypertext processor');
    
    echo http_build_query($data) . "\n";
    echo http_build_query($data, '', '&');
    
    //前置詞
    $data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
    echo http_build_query($data, 'myvar_');  
    --
    foo=bar&baz=boom&cow=milk&php=hypertext+processor
    foo=bar&baz=boom&cow=milk&php=hypertext+processor
    myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor
    
  • 解url字串
    利用parse_str
    <?php
    $str = "first=value&arr[]=foo+bar&arr[]=baz";
    parse_str($str);
    echo $first;  // value
    echo $arr[0]; // foo bar
    echo $arr[1]; // baz
    
    parse_str($str, $output);
    echo $output['first'];  // value
    echo $output['arr'][0]; // foo bar
    echo $output['arr'][1]; // baz

星期一, 10月 10, 2011

git log

  • 一般
    • 查看commit歷程
      # git log    
      # git log --stat  // 更動檔案和異動的行數
      # git log <file> //指定檔案
      
      # git diff --name-only // 最近一次的commit有哪些檔案被修改
  • 排版
    • 圖形化commit歷程
      看了沒fu嗎… 用文字圖形化看吧
      git log --graph            //文字圖示版本
      
    • 異動的內容
      即為git diff的內容,太多不寫了,看reference裡有
      $ git log -p
      
    • 一列一版本
      查看版本一目瞭然...... 前提是commit的message要跟範例一樣清楚的話....
      git log --pretty=oneline
      --
      a6b444f570558a5f31ab508dc2a24dc34773825f dammit, this is the second time this has reverted
      49d77f72783e4e9f12d1bbcacc45e7a15c800240 modified index to create refs/heads if it is not 
      9764edd90cf9a423c9698a2f1e814f16f0111238 Add diff-lcs dependency
      e1ba1e3ca83d53a2f16b39c453fad33380f8d1cc Add dependency for Open4
      0f87b4d9020fff756c18323106b3fd4e2f422135 merged recent changes: * accepts relative alt pat
      f0ce7d5979dfb0f415799d086e14a8d2f9653300 updated the Manifest file
    • 特定資料夾
      $ git log fs/           # commits that modify any file under fs/
      
  • 搜尋及過濾
    • 誰異動的,何時,哪個commit
      # git blame filename
      commit    author when
      --------  ---- -------------------------
      394d743f (fish 2013-10-22 17:22:34 +0800  8)     public function getSource()
      394d743f (fish 2013-10-22 17:22:34 +0800  9)     {
      394d743f (fish 2013-10-22 17:22:34 +0800 10)         return "";
      394d743f (fish 2013-10-22 17:22:34 +0800 11)     }
    • 用文字找版本
      $ git log -S'foo()'     # commits that add or remove any file data matching the string 'foo()'
      
    • 最近二周
      $ git log --since="2 weeks ago" # commits from the last 2 weeks
      
      其他還有--after, --until, and --before
    • 不要顯示merge的版本
      $ git log --no-merges
      
其他
$ git log v2.5..        # commits since (not reachable from) v2.5
$ git log test..master  # commits reachable from master but not test
$ git log master..test  # commits reachable from test but not master
$ git log master...test # commits reachable from either test or
                        #    master, but not both
References

星期日, 10月 09, 2011

git stash 暫存

當要checkout b branch時,當下a branch的資料如果未commit 就會連當被帶過去b branch
//假設有a, b branches且都有file1內容為1-1
# echo '1-2' > file1
# git checkout b
M       file1
Switched to branch 'b'
# cat file1
1-2
  • 丟入暫存
    但如果未完成又不想commit時 可利用git stash
    # echo '1-2' > file1
    # git stash 
    # cat file1
    1-1     <-- 被reset, 這時就可以切換
  • 取出
    # git stash pop
    # cat file1
    1-2     <--再被改為stash的內容
    git stash可重覆使用,用法如stack 多下個幾次就堆疊起來,取法一樣pop囉
更多指令
  • git stash list (列出stash的清單)
    # git stash list 
    stash@{0}: WIP ...   //第1個暫存 
    stash@{1}: WIP ...   //第2個暫存
  • git stash pop (取出暫存)
       # git stash pop     // pop out 最後進入的stash
       # git stash apply  // 跟pop一樣. 但不會清掉stash
       # git stash apply stash@{1} //取出陣列1的stash
       # git stash drop stash@{1} //刪掉,不套用
       # git stash clear   // 不用解釋吧...

git還原 - revert, reset, checkout


  • 回復至最近一次commit(所有檔案)
    $ git reset --hard HEAD
  • 還原修改過的單一檔案
    有以下不同的方法
    //以下從staging取出
    $ git checkout hello.txt    //1
    $ git checkout -- hello.txt //2
    $ git checkout -f hello.txt //3
    
    //以下從HEAD最新版取出
    $ git checkout HEAD hello.txt //4
    

    ex. 假設HEAD的hello.txt 如果為hello
    $ echo 'hi' > hello.txt  //這時三者皆相同
    $ git add . //放到staging,這時1,2,3取到staging(hi),4取到hello
    
    感謝Charlie Lee的訂正,本以為-f也會取到hello
    話說不知道當初為何要看-f參數,這參數是用在"強制換"branch時,不理會當下修改的檔案,跟"還原"檔案沒什麼關係 XD
    可能當初還不太懂,看著人家寫就照抄
  • Staging(git add)後,要退回unstage
    $ git reset HEAD file
  • 回復特定版本
    雖說是回復,但其實是將指定的版本新增為最新的commit
    $ git revert commit_name
    不過通常回復到舊版本,是要繼續往下開發
    所以勢必得再一次commit
    所以如果只是要回復且不要commit 可以加 -n or --no-commit
    $ git revert -n commit_name
    如果要修改的話 得commit或放棄,否則沒辦法回復
    • fatal: Commit 137ea95 is a merge but no -m option was given.
      因為該commit為merge(兩個branches合併,所以得指定要回復的branch (-m or --mainline option) 搭配數字 1 or 2 指定第幾個commit
  • 從commit裡,指定checkout檔案
    格式:git checkout SHA /file/to/path
    $ git checkout 35216 controller/ui.php
  • 從branch裡,指定checkout檔案
    格式:git checkout <branch_name> <paths> #會在相同的資料夾找
    格式:git checkout <branch_name> -- <paths>
    $ git checkout branch_b test.php  //從branch_b取出test.php
  • 改變最後一次的 Commit的訊息
    git commit --amend (改git log的內容)
References

星期六, 10月 08, 2011

git 常見問題

  1. 程式改爛了,怎麼還原
    • 還原單一檔案
      $ git checkout hello.txt
      
    • 整個還原到最後commit版本
      $ git reset --hard HEAD
      
      只會還原上一版本有加入track的檔,還沒加入的新檔不會變更
  2. 回復特定版本
    雖說是回覆,但其實是將指定的版本新增為最新的commit
    $ git revert commit_name
  3. checkout某版本或分支的特定檔
    git checkout SHA-1 --  FILE_PATH
    git checkout BRANCH_NAME -- FILE_PATH
  4. 衝突了!怎麼解
    打開confilct的檔案
    <<<<<<<<     HEAD
    目前的版本
    ---------------------
    上一個版本
    >>>>>>>>>> 版本碼
    只要看哪個正確,改正就可以了
    
  5. 要切換branch,還不想commit
    1. 先丟到暫存區
      $ git stash
      
      這時會回到最後commit的結果
      不過未經commit的新檔不會改變,也不會被刪除
    2. 取回暫存
      $ git stash pop
      
  6. 圖示commit版本
    • $ git log --graph
    • commit後,想修改message
      $ git commit --amend
      
  7. 新增remote
    • 查目前所有的remote點
      $ git remote -v
    • 新增remote點
      $ git remote add remote別名 repository的url位置
    • 移除remote點
      $ git remote rm remote名

  8. push回origin權限不足
    通常創repository跟clone下來的帳號不同
    造成要push回去時,會有權限不足的問題
    可利用group的解決這問題
    sudo chmod -R g+ws *
    sudo chgrp -R YOUR_GROUP *
    
    git config core.sharedRepository true