發表文章

目前顯示的是有「git」標籤的文章

升級gitea

圖片
升級gitea 至 1.23.7 (2025-04-24)

Note:Show git branch in bash prompt

圖片
Reference: How to show current git branch with colors in Bash prompt https://thucnc.medium.com/how-to-show-current-git-branch-with-colors-in-bash-prompt-380d05a24745 vim ~/.bashrc parse_git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' } if [ " $color_prompt " = yes ]; then # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' PS1 = "\[\033[01;32m\]\u@\h\[\033[00m\]: \[\e[32m\]\w \[\e[91m\] \$ (parse_git_branch)\[\e[00m\]$ " else mirochiu@mirochiu-d820mt: /mnt/hdd2/node.repo/linebot_speech (master)$ c     

解決git在Windows下中文亂碼問題

修正git中文亂碼問題 1. 修正git-gui和gitk git config --global gui.encoding utf-8 2. 修正git show 永久設使用者環境變數 SETX LC_ALL C.UTF-8 需使用系統管理員權限的powershell或命令提示字元 3. 修正git status 顯示中文檔名亂碼 git config --global core.quotepath false 參考資料 https://blog.miniasp.com/post/2017/09/17/Git-for-Windows-Command-Prompt-Display-Chinese-Issues

修改git commit的author

  發現新電腦設定git設錯e-mail了,只好用 git rebase -i --root 讓git從一開始的commit開始改 然後把每個commit前面都改e 然後 git commit --amend --author="{你的暱稱} <{你的E-mail}>" git rebase --continue 無限迴圈直接結束 據說還有有更快的方法,之後有空再研究了。

git gui亂碼解決方案

gitk、Git GUI 图形化工具中文显示乱码的解决方案 https://www.cnblogs.com/wei9593/p/11758837.html windows下的git gui/gitk遭遇中文字亂碼 1. 開啟git bash 2. 執行git gui設定 git-gui 3. 找選單 edit->options->右邊全域的->Default File Contents Encoding 設定為"utf-8"

筆記:github page

如果你要創建一個xyz.github.io的github page github註冊使用者xyz  創建一個repository名為xyz.github.io (選項)將branch取名為gh-pages (可以從Setting分頁選擇,已不是必要步驟) 將網頁圖文資料加入到該branch,並將分支上傳到github。 進入該repository的Settings分頁,選擇GitHub Pages要使用的branch (預設上傳完應該自動就選好了)。 瀏覽你的github page https://xyz.github.io 如果你有其他repository也是可以設定github page,只是預設會是xyz.github.io/respository_name 如果你有自己的CNAME,也可以在GitHub Pages上設定指到github page。 缺點: 只能放靜態網頁。 所有資料都是公開的。 有網站容量限制。 有流量及瀏覽量限制。 Github官方Steps https://help.github.com/en/github/working-with-github-pages/getting-started-with-github-pages 或參考龍哥的介紹 https://gitbook.tw/chapters/github/using-github-pages.html

git remote指令操作

推入遠端 將最新的commit(HEAD)推入遠端origin (Code Review) git push origi n HEAD:refs/for/master 推入遠端 git push origin master 邪惡版推入遠端(強制) git push origin master --force -f是--force的短指令 如果我目前分支不是master而是yhchiu , 但是我想推到遠端上改成new_patch這個分支 git push origin yhchiu:new_patch 實際上不見得一定要推分支 , 指定某個commit也可以推 顯示本地跟遠端所有branch git branch -a 顯示有哪幾個遠端名稱/遠端名稱及網址/遠端詳細訊息 git remote show git remote -v 加入新的遠端伺服器,命名為origin2 git remote add origin2 ssh://yhchiu@192.168.10.30:29418/NewDevice 下面是一個遠端同步的應用: 我在遠端伺服器192.168.10.30上面用我的帳號yhchiu的家目錄中建立了一個資料夾public並在上面clone了NewDevice的git庫,所以我就會有一個/home/yhchiu/public/NewDevice的git資料夾 我可以在另一台電腦上直接clone我家目錄下的這個git ssh://yhchiu@192.168.10.30/home/yhchiu/public/NewDevice 另外我也可以將這個url加入remote變成合併原本的目錄和我在我家目錄上建的目錄 刪除某個遠端伺服器 git remote rm origin2 遠端伺服器改名 git remote rename pb paul 更新遠端資料 git pull 不要隨便在任一個commit/branch之後或是使用這個指令,是否亂掉可以用gitk查看左上角的分支線路,不是一條而是有迴圈就是出問題了,得先要恢復到某個版本 git pull origin master 從所有的遠端伺服器上抓取資料/從預...

git全域設定,局部設定與移除/取消設定

git分為全域設定和局部設定(Repo內) 忽略空白處變化,如果是寫python的話就不能忽略空白處變化 基於讓每個環境都有一致的呈現結果,我也不建議忽略空白處變化 git config --global apply.whitespace nowarn 有些git下載回來設定檔裡面有no-fast-forward的設定,會阻止我們用force push修改以前的修正 git config branch.master.mergeoptions "--no-ff" 如果想拿掉某個config就用unset來取消設定 git config --unset branch.master.mergeoptions 若主要是在ubuntu中開發, 而偶爾會在windows上開發,建議windows部份設定忽略檔案的屬性改變,以及讓git自動轉換換行字元(CRLF->LF) 非常不建議同一份git目錄在windows開發又搬移到linux上開發, 因為會有換行/權限/等等的問題 git config --global core.fileMode false # In Windows/Mac, push/pull convert the line feed git config --global core.autocrlf true # In Ubuntu/Linux,convert CRLF to LF while push git config --global core.autocrlf input Ref:https://help.github.com/articles/dealing-with-line-endings/ Windows  CRLF => \r\n Linux LF \n Mac CR \r 檢查文件是否混合兩種換行方法,若有就會拒絕commit, 因為換行會成script無法正確的parsing,所以我會建議設定這個 git config --global core.safecrlf true 如果檔案被拒絕,可以用dos2unix將檔案的換行符號換成unix的LF 如果你修改了上面這些設定,請確保你的git目錄內的檔案都是一致的 git rm --cac...

AOSP的repo轉成git

移除AOSP編譯暫存檔案,repo的管理資料,以及各個repo用的各個git目錄 實務上,我個人會比較建議用git clean -df和git reset --hard HEAD每個,來清除暫存檔案 rm -rf out rm -rf .repo find ./ -type d -name .git |  xargs -i rm -rf {} 備份.gitignore到家目錄的bak.gitignore rm -rf ~/bak.gitignore mkdir ~/bak.gitignore find ./ -name .gitignore  | sort > ~/bak.gitignore/gitignorelist.txt find ./ -name .gitignore | xargs -i cp --parents {} ~/bak.gitignore/ 檢查一下拷貝的檔案數目是否正確 wc -l ~/bak.gitignore/gitignorelist.txt find ~/bak.gitignore/ -type f | sort | wc -l 將所有檔案加入git git init git add -A -f git commit -m "init repo" 然後再把~/.bak.gitignore內備份的gitignore加回去 cp ~/.bak.gitignore / . find ./ -type f -name .gitignore | xargs -i git add {} git commit -m ".gitignore recovered" 轉換好之後需要編譯看看是否有問題,我自己最常遭遇的就是build system內部有自動打patch或者重置到某個commit的指令,而因為我們把repo和原本的git都刪除了,會造成那些script失效,需視狀況在進行調整。

git bare的branch轉換成一般git

將bare的git repository轉換成一般的git repository

取得git短碼,標題與workspace頂層目錄

取得commit版本sha1短碼 git log -10 --oneline | cut -d " " -f 1 取的commit的標題 git log -10 --oneline | cut -d " " -f 2- 取得目前git的workspace 頂層目錄 git rev-parse --show-toplevel 當前若不是git目錄, 但是還是想某目錄內的git指令, 只要先打-C和目錄, 目錄不需要在work頂層目錄 git -C "/media/hd2/pub.repo/mypack/data" status 另外有--git-dir指定.git所在目錄, --work-tree指定工作目錄 git --git-dir="/media/hd2/pub.repo/.git" --work-tree="/media/hd2/pub.repo/" status 如果沒指定--git-dir, git會使用git rev-parse --show-toplevel取得頂層目錄 如果沒指定--work-tree, git會取得當前目錄當作work-tree 目前目錄要回到頂層目錄的 git rev-parse --show-cdup 例如頂層目錄在/media/hd2/pub.repo/ , 我在/media/hd2/pub.repo/mypack/data裡面打這個指令, 會得到../../ 所以要回到頂層目錄可以打 cd $(git rev-parse --show-cdup)

git查兩個commit的距離

方法1 git log {old versioin}..{new version} --oneline | wc -l 方法2(較快) git rev-list {old versioin}..{new version} --count rev-list只印出sha1 code 例如: git log HEAD~10..HEAD --oneline | wc -l git rev-list HEAD~10..HEAD --count Reference: http://gal.steinitz.com/blog/2013/07/27/git-tips-count-number-of-commits-between-two-commits/

git電子書

PeepCode - Git Internals https://github.com/pluralsight/git-internals-pdf/releases

Repo使用筆記

圖片
repo其實就是管理眾多git與專案的工具,他本身是用python所構成 下載Repo並設定系統路徑 $ mkdir -p ~/bin/ $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo $ export PATH=${HOME}/bin:${PATH} repo的網址我已經看到很多不同的URL,我會建議使用 Android文件 上提供的網址 設定Repo要下載的專案庫 例如AOSP的repo是https://android.googlesource.com/platform/manifest $ repo init -u https://android.googlesource.com/platform/manifest 如果是要ssh登入的就是用下面類似格式 $ repo init -u ssh://帳號@可供下載的Repo網址 設定來源的同時指定要切換的branch使用-b $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 repo init之後實際上會在當前目錄建立隱藏目錄.repo,並將manifest的設定從server上帶下來, 裏面會有個manifest.xml,用ls -l察看該檔案可以看到他連結到manifests目錄內的某個.xml 這個manifests目錄就是可以供選擇的專案,如果想要選擇的不是預設的專案,可以透過repo init -m 來指定要變更的xml名稱。 $ repo init -m proj20151031.xml 跟你直接改manifest.xml連結的對象也是同樣意思 看repo init的指令說明 $ repo init -h 開始下載或更新 $ repo sync -j8 -j後面的數字是連線數目 如果下載有問題可以使用proxy和更改系統設定增加穩定性,設定請參考 android文件 說明 列出目前Repo的git projects $ repo lis...

拷貝某commit變更的檔案群

首先你要先切換到你想要拷貝的commit,例如v2.3這個tag git checkout -b newbranch v2.3 然後才開始拷貝檔案,不然你拿到的會是當前branch內的檔案,而不是該commit的 mkdir -p ~/bak/ git show --name-only v2.3 | xargs -i cp --parents {} ~/bak/ 這方法若遇到git內有檔案被刪除的,會顯示拷貝錯誤的訊息 因為用git show會顯示commit的訊息,所以會有幾行拷貝錯誤的訊息,要解決這問題可以換成git diff來處理,但是缺點就是git會先跑git status的整體檔案check,所以要等待一陣子才會處理好 git diff --name-only v2.3^ v2.3 | xargs -i cp --parents {} ~/bak/ 確認拷貝完整性 列出當前commit的修改檔案的個數 git diff --name-only v2.3^ v2.3 | wc -l 列出拷貝出的patch檔案個數 find ~/bak -type f | sort | wc -l

初始化/複製git程式庫

初始化一個Repository git init 初始化一個server形式的Repository(看不到原始碼檔案) git init --bare 複製某個 Repository git clone https://gogojimmy@github.com/gogojimmy/Animal.git 複製某個 Repository並該資料夾命名成 monkey git clone https://gogojimmy@github.com/gogojimmy/Animal.git monkey Clone並切到指定的branch(和一般clone只差在clone完後是在指定的branch) git clone -b  git clone --branch   如果不存在該branch,就還是會用default branch 只抓Repository中的一個branch (git --version > 1.7.9) git clone -b --single-branch 因為上面的指令需要等高版本,要安裝更高版本可以透過下面這個ppa sudo add-apt-repository ppa:git-core/ppa sudo apt-get update sudo apt-get install git Shallow clone  git clone --depth=1 https://gogojimmy@github.com/gogojimmy/Animal.git git fetch --depth=10 # 10 can be any positive number  解除Shallow clone git fetch --unshallow

git的暫存工作功能

Stash 我們常常會需要切換到某個branch查看一些commit內容,但是我們已在當前branch上有了一些修改,在切換分支會被git要求commit或放棄變更, 像是下面這樣 5764cf9..5d8cc2a master -> origin/master Updating 5764cf9..5d8cc2a error: Your local changes to '.oppbuildspec' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge. 我們雖然我們可以透過開分支,並將所有變更提交上去的方式來處理,但是有時會忘記哪些內容是還在處理而不該提交! 這種尷尬的時刻 可透過stach來處理,  stash是直接會將目前的工作儲存下來,並且會維護變更狀態 git stash  git stach save "命名" stash不隸屬與某個分支,要刪除它只能透過drop指令來刪除 git stash drop 列出所有的stash git stash list 套用已暫存的工作 git stash apply 取消最近一筆已套用的暫存工作 git stash unapply 參考檔案: http://git-scm.com/book/zh-tw/v1/Git-%E5%B7%A5%E5%85%B7-%E5%84%B2%E8%97%8F-Stashing

AOSP Clone到一半的git斷線如何續傳?

先進入斷線要恢復的專案的.git目錄下 git fetch git checkout FETCH_HEAD 例如下載AOSP的檔案都很大,外加網路不穩,導致repo常常會需要重新來過 假如我在下面這裡斷掉,也可以應用git來續傳 : export GIT_DIR=/home/yhchiu/aosp/.repo/projects/prebuilts/sdk.git : git fetch aosp --tags +refs/heads/*:refs/remotes/aosp/* +refs/tags/android-4.4.2_r2.0.1:refs/tags/android-4.4.2_r2.0.1 remote: Sending approximately 1.92 GiB ... remote: Counting objects: 75, done remote: Finding sources: 100% (75/75) ^CTerminatedjects:  69% (6553/9445), 731.14 MiB | 1.22 MiB/s   cd ~/aosp/.repo/projects/prebuilts/sdk.git git fetch aosp --tags +refs/heads/*:refs/remotes/aosp/* +refs/tags/android-4.4.2_r2.0.1:refs/tags/android-4.4.2_r2.0.1 雖然說可以續傳,不過進度還是會減少

Git GUI tool

Git GUI 看版本的GUI,可作回復版本 gitk & 看所有分支的狀態,merge各種branch中的patch的時候很實用! gitk --all & 線路看起來很亂,但是如果你一直在自己的workspace開發就會比較好看,因為它會把最近修改放到最上面 gitk --all -50& # 限制只嗅出最新的50的commit gitk --branches& # 只顯示本地branch gitk {某個bracnch名稱}&  # 只顯示指定branch TIG tig  看git log的工具,command line的 sudo apt-get install tig 簡易說明 http://blog.kidwm.net/388 手冊http://jonas.nitro.dk/tig/manual.html 基本操作使用方向鍵,或是用j/k和 vim 一樣代表下 上移動 page on/off 可以上下頁操作 tig預設是進入main模式, m可回到main模式, 按Enter是在下半部顯示該commit資料,可以和vim裡面一樣用/和?搜尋該commit修改內容,上下個搜尋也是n/N, Tab可以切換上下或左右分頁 l是進入log模式,會洩出所有的commit修改檔案紀錄 q是離開程式,或是回到上一頁,大寫的Q是直接離開tig h是顯示tig操作說明 H是進入branch模式 S是進入status模式,也就是git status,按e可以編輯檔案,按M可以呼叫外部編輯器解決conflit t是進入tree模式,也就是檔案目錄模式,按e可以編輯檔案,Enter會在下半區顯示檔案內容 R/F5刷新頁面 在main模式下,按C是cherry-pick 目前游標所在的commit 在branch模式下按C是checkout 目前游標所在的bracnh 顯示所有分支/前50個commit tig --all tig --all -50 參數類似gitk

git使用筆記1

查看目前檔案變更狀態 git status 分為已追蹤(tracked)跟尚未追蹤(untracked) 如果是track的檔案有變更,會列在changes not staged for commit底下 如果是新加入的檔案,會列在untracked files, 如果是新加入的目錄,裡面沒檔案則不會列出來,如果裡面有檔案也只會 在untracked files 列出該資料夾 顯示commit記錄/近5筆記錄/ 近5筆記錄的指令 縮寫 git log  git log -n 5 git log -5 加入變更/加入所有變更/互動式加入變更,也能夠把untrack的檔案變成track git add git add .   #不建議隨意使用跟git add -A類似 git add -i  #互動式加入(路徑太長可以用選的) 互動式加入變更進去之後選2 update,然後把要加入項目前的數字打進去,例如要加入1,7項想加入就打1 7然後 提交變更 git commit -m "version description" 我常常會忘記add再加,雖然git會忽略沒有add的檔案,但是最好先check log再繼續 將新的變更加入到上一次commit的內容中,當然還是得先add git commit --amend 捨棄所有變更並恢復到最新的commit狀態/前一個commit狀態/往前10個commit的狀態 git reset --hard HEAD git reset --hard HEAD^ git reset --hard HEAD~10 不捨棄變更, 只是把commit狀態回到前一個狀態 git reset --soft HEAD^ 恢復某個檔案到上一次commit的狀態/到上上次的commit的狀態 git checkout -- {filepath} git checkout HEAD^^ --  {filepath} git checkout {version-hash-code} --  {filepath} 最近某檔案的詳細...