境)
簡(jiǎn)介PortableGit V2.3564位是為Windows平臺(tái)打造的Git便攜發(fā)行版面向需要在多臺(tái)電腦間移動(dòng)開(kāi)發(fā)、又不愿安裝復(fù)雜環(huán)境的開(kāi)發(fā)者解決版本控制工具隨身攜帶與快速使用的問(wèn)題V2.35更新包含性能提升、新功能與錯(cuò)誤修復(fù)較舊版更穩(wěn)定。軟件集成Git命令行工具、Git Bash終端、Git GUI圖形界面及必要運(yùn)行庫(kù)可在U盤或移動(dòng)硬盤中直接運(yùn)行不在主機(jī)系統(tǒng)留下痕跡也便于離線或受限網(wǎng)絡(luò)環(huán)境下使用。壓縮包約115.03MB內(nèi)含6057個(gè)文件核心為exe、dll等可執(zhí)行程序與運(yùn)行庫(kù)輔以pl/pm/sh/py等腳本來(lái)擴(kuò)展命令html、txt等構(gòu)成文檔幫助體系vim/tcl等為編輯器與環(huán)境配置。已有306人學(xué)習(xí)下載。借助內(nèi)置的分支管理、合并、回滾及常用git clone/add/commit/push/pull操作用戶可以高效完成代碼版本管理和團(tuán)隊(duì)協(xié)作Git Bash還可提供類Unix體驗(yàn)Git GUI則降低命令行門檻適合從入門到進(jìn)階的開(kāi)發(fā)者隨時(shí)調(diào)用。1. PortableGit V2.3564 位Windows 便攜版從 U 盤里跑起來(lái)的一整套 Git 環(huán)境如果只是臨時(shí)跑個(gè)項(xiàng)目沒(méi)人愿意在一臺(tái)陌生的 Windows 上一步步點(diǎn)安裝向?qū)?。PortableGit V2.3564 位就是那個(gè)解壓即用的選擇它不寫注冊(cè)表、不往系統(tǒng)目錄里塞文件解壓到一個(gè)文件夾就能開(kāi)出完整的 Git Bash版本由你說(shuō)了算換機(jī)器拔 U 盤就走。我自己的 U 盤里常駐一份這樣的便攜版遇到客戶機(jī)器、CI 環(huán)境或者剛裝好的系統(tǒng)第一件事就是把它拉出來(lái)用。它的價(jià)值對(duì)你來(lái)說(shuō)分三種想在一臺(tái)機(jī)器上維護(hù)多個(gè) Git 版本項(xiàng)目要求固定版本不跟著系統(tǒng)升級(jí)走或者單純不想讓安裝過(guò)程污染環(huán)境。下面就從解壓到配置、踩坑把它講透。2. 部署與驗(yàn)證解壓后怎么讓 cmd 和 PowerShell 都認(rèn)出 git2.1 解壓與啟動(dòng)方式不只是雙擊 git-bash 這一條路拿到 V2.35 的壓縮包之后先找一個(gè)沒(méi)有特殊權(quán)限要求的目錄。官方傾向于解壓到某個(gè)盤的根目錄但實(shí)際使用中放在 D 盤深層路徑也可以。我一般會(huì)解壓到 D:\portable-git\路徑里不要有空格和中文字符后面做腳本調(diào)用時(shí)會(huì)少很多煩惱。解壓完成后頂層目錄大致長(zhǎng)這樣cmd\git.exe僅供 Windows 命令行直接調(diào)用的入口后面 PATH 配的就是這個(gè)目錄。git-bash.exe完整模擬 unix 環(huán)境的終端日常交互式操作首選。usr\bin\bash.exe被腳本間接調(diào)用的 bash 本體做自動(dòng)化時(shí)用這條路徑。etc\Git for Windows 的全局配置文件目錄里面有 gitconfig 和 inputrc。啟動(dòng)方式可以分三層理解。交互式用 git-bash.exe它會(huì)自動(dòng)加載 /etc/profile把 unix 工具鏈都塞進(jìn) PATHWindows 原生終端里用 cmd\git.exe前提是 PATH 要配好腳本里用 usr\bin\bash.exe --login 來(lái)跑 .sh 文件這層最可控同一份腳本在不同機(jī)器上的行為是一致的。很多人只停留在雙擊 git-bash一旦代碼里需要調(diào)用 git 命令就翻車問(wèn)題往往不在 PortableGit 本身而是啟動(dòng)方式?jīng)]選對(duì)。還有一個(gè)細(xì)節(jié)值得注意git-bash.exe 和 usr\bin\bash.exe 是兩個(gè)不同層級(jí)的入口。前者是圖形終端包裝會(huì)新開(kāi)窗口后者是純命令行 bash適合被其他進(jìn)程調(diào)用。日常提交代碼用前者寫自動(dòng)化任務(wù)用后者不要把兩者混著用。我在一臺(tái)沒(méi)裝過(guò) Git 的干凈機(jī)器上驗(yàn)證過(guò)解壓完成后直接用 git-bash 就能跑 git clone這也是便攜版最直觀的價(jià)值解壓即用。2.2 把 cmd 目錄放進(jìn) PATHsetx 的坑與更穩(wěn)的替代如果只開(kāi) Git BashPATH 配不配無(wú)所謂因?yàn)?git-bash 啟動(dòng)時(shí)自己會(huì)加。但要在 cmd、PowerShell 和各類編輯器里直接敲 git就得把 D:\portable-git\cmd 加進(jìn) PATH。常見(jiàn)做法是用系統(tǒng)設(shè)置里的「環(huán)境變量」對(duì)話框在用戶變量 Path 里追加這一條。我不推薦用 setxsetx PATH %PATH%;D:\portable-git\cmd這條命令有兩個(gè)坑。第一setx 對(duì)環(huán)境變量的長(zhǎng)度上限是 1024 個(gè)字符一旦原 PATH 太長(zhǎng)多余部分會(huì)被靜默截?cái)嗟饶阆麓沃亻_(kāi)終端才發(fā)現(xiàn)一堆工具找不到了。第二%PATH% 展開(kāi)的是運(yùn)行時(shí)合并了系統(tǒng)變量和用戶變量的完整值setx 會(huì)把這份合并結(jié)果寫回用戶變量等于把系統(tǒng)目錄也抄了一份進(jìn)去之后系統(tǒng)目錄更新你的用戶變量也不會(huì)跟著變邏輯上就擰巴了。更穩(wěn)的做法有兩條。圖形界面里用 sysdm.cpl 手動(dòng)改這個(gè)大家都會(huì)自動(dòng)化場(chǎng)景里我一般用 PowerShell 改用戶級(jí) Path[Environment]::SetEnvironmentVariable( Path, [Environment]::GetEnvironmentVariable(Path, User) ;D:\portable-git\cmd, User )這段代碼只操作 User 作用域不會(huì)把系統(tǒng) PATH 混進(jìn)來(lái)也不會(huì)觸碰到 1024 字符的截?cái)?。參?shù)上唯一的注意點(diǎn)是用戶級(jí) Path 可能包含 %USERPROFILE% 這類未展開(kāi)變量讀出來(lái)寫回去時(shí)最好用原始字符串別讓它展開(kāi)成絕對(duì)路徑。改完以后當(dāng)前已經(jīng)打開(kāi)的終端不會(huì)自動(dòng)感知重開(kāi)一個(gè)窗口再驗(yàn)證。PowerShell 里還有一個(gè)臨時(shí)驗(yàn)證的小技巧不用改永久變量直接在當(dāng)前會(huì)話刷新 $env:Path適合你只想在當(dāng)前窗口試一下的場(chǎng)景。但注意這只是會(huì)話級(jí)生效下次開(kāi)終端就沒(méi)了不能替代真正的用戶級(jí)配置。2.3 版本驗(yàn)證與多 Git 排查怎么確認(rèn)跑的是 PortableGit 而不是別的PATH 配完重開(kāi)一個(gè)終端先驗(yàn)證三件事git --version git --exec-path which git第一條確認(rèn)版本V2.35 會(huì)輸出 git version 2.35.1.windows.2 這種帶 windows 標(biāo)記的版本號(hào)第二條確認(rèn)內(nèi)置命令在 PortableGit 目錄下而不是某個(gè)系統(tǒng)自帶 Git 的安裝位置第三條在 cmd 里應(yīng)該顯示 D:\portable-git\cmd\git.exe。如果 which git 指向的是 C:\Program Files\Git\cmd\git.exe說(shuō)明系統(tǒng)里已經(jīng)裝了別的 Git并且它的 PATH 順序排在你前面。這里不妨多說(shuō)兩句 Windows 解析命令的機(jī)制。Windows 按 PATH 從左到右找第一個(gè)命中的可執(zhí)行文件找到就用不再往后看。所以 PortableGit 想生效要么把它的 cmd 目錄往前挪要么在需要時(shí)用絕對(duì)路徑調(diào)用。Git Bash 內(nèi)部對(duì) Windows PATH 的加載順序有自己的規(guī)則它會(huì)在啟動(dòng)腳本里把自己 unix 工具目錄優(yōu)先所以雙擊 git-bash 時(shí) git 命令多半沒(méi)問(wèn)題問(wèn)題集中在 cmd 和 PowerShell。排查時(shí)用 where git 列全部候選路徑一眼就能看到底是哪一份 Git 在響應(yīng)。這種問(wèn)題往往不是 PortableGit 的問(wèn)題是系統(tǒng)里本身就有安裝版 Git兩個(gè)并存時(shí)產(chǎn)生了優(yōu)先級(jí)競(jìng)爭(zhēng)。把 PortableGit 的用戶 PATH 條目前移之后再執(zhí)行 git --version 確認(rèn)變更生效。版本驗(yàn)證這一步里git --exec-path 我建議每次都看一眼因?yàn)樗鼙┞秲?nèi)置命令的物理位置比單純看版本號(hào)更能確認(rèn)到底在執(zhí)行哪一套。3. 初始化一組能隨身帶的配置用戶信息、換行符與憑證3.1 全局用戶信息與配置文件位置的取舍解壓后第一件事是配置 user.name 和 user.email。這個(gè)大家都知道但 PortableGit 場(chǎng)景下有個(gè)特殊點(diǎn)全局配置寫到哪個(gè) HOME 下。默認(rèn)情況下PortableGit 的 HOME 指向 C:\Users\你的用戶名也就是和系統(tǒng)安裝版 Git 共用同一個(gè) .gitconfig。如果你只是想臨時(shí)用這沒(méi)問(wèn)題但如果你想讓便攜環(huán)境真正獨(dú)立就得把 HOME 指到 PortableGit 目錄附近。git config --global user.name 你的名字 git config --global user.email 你的郵箱這兩條命令決定的只是往哪個(gè)文件寫配置。--global 對(duì)應(yīng)用戶級(jí) $HOME/.gitconfig--system 對(duì)應(yīng) PortableGit 的 etc/gitconfig--local 對(duì)應(yīng)倉(cāng)庫(kù)內(nèi) .git/config。優(yōu)先級(jí)是 local global system。我的習(xí)慣是別名、換行符這類通用偏好放 global機(jī)器相關(guān)的配置也盡量放 global不碰 system 文件。因?yàn)?etc/gitconfig 在 PortableGit 升級(jí)時(shí)可能被覆蓋放自己可控的 global 更省心。想讓配置跟著 U 盤走只需在啟動(dòng) git-bash 之前把 HOME 環(huán)境變量指向便攜目錄下的一個(gè)子目錄例如 D:\portable-git\home。之后所有 --global 配置、SSH 密鑰、還有 .gitconfig 都會(huì)落在那個(gè)目錄里換機(jī)器解壓一份新的 PortableGit把環(huán)境變量一配配置就全回來(lái)了。這里的關(guān)鍵是理解 HOME 的作用范圍git 配置、ssh 找密鑰、bash 找 .bashrc全都會(huì)看這個(gè)變量。不要把它和 Windows 的 USERPROFILE 混為一談那兩個(gè)指向不同的語(yǔ)義。3.2 換行符策略autocrlf 三個(gè)選項(xiàng)和 .gitattributes 兜底Windows 上 Git 最經(jīng)典的問(wèn)題就是換行符。倉(cāng)庫(kù)里存 LFWindows 編輯器默認(rèn) CRLF如果不管會(huì)出現(xiàn)每次進(jìn)入編輯都提示文件被修改的情況。core.autocrlf 有三個(gè)值trueWindows 下推薦。checkout 時(shí)把 LF 轉(zhuǎn) CRLFcommit 時(shí)把 CRLF 轉(zhuǎn) LF。單機(jī)用很省心。input提交時(shí)把 CRLF 轉(zhuǎn) LFcheckout 不轉(zhuǎn)換。適合你確定編輯器會(huì)輸出 LF、只是想把臟行尾擋在提交之前的情況。false完全不轉(zhuǎn)換。項(xiàng)目里已經(jīng)有嚴(yán)格 LF 規(guī)范、或者倉(cāng)庫(kù)文件類型復(fù)雜時(shí)用這個(gè)。V2.35 的 Git for Windows 默認(rèn)值是 true。但我不建議在配置文件里單獨(dú)依賴這一個(gè)開(kāi)關(guān)因?yàn)椴煌碌?autocrlf 各不相同倉(cāng)庫(kù)里既有 LF 又有 CRLF 時(shí)照樣會(huì)亂。更穩(wěn)的做法是倉(cāng)庫(kù)根目錄維護(hù) .gitattributes用規(guī)則聲明哪些文件用什么行尾* textauto *.sh text eollf *.bat text eolcrlf *.png binarytextauto 讓 Git 對(duì)文本文件做規(guī)范化eollf 和 eolcrlf 精確鎖定各類型文件的行尾binary 把二進(jìn)制文件排除在外。.gitattributes 在團(tuán)隊(duì)倉(cāng)庫(kù)里是提交到遠(yuǎn)程的所以它的規(guī)則對(duì)所有人生效優(yōu)先級(jí)高于各人本地的 autocrlf。我個(gè)人經(jīng)驗(yàn)是只要是跨平臺(tái)項(xiàng)目.gitattributes 必須進(jìn)倉(cāng)庫(kù)本地 autocrlf 只是兜底。換行符問(wèn)題處理完后如果倉(cāng)庫(kù)里已經(jīng)有舊文件帶著錯(cuò)誤行尾跑一遍 git add --renormalize . 讓 Git 按新規(guī)則重新規(guī)范化索引這是不重寫工作區(qū)的最快辦法。如果行尾告警只是偶爾出現(xiàn)不想大動(dòng)干戈也可以在本地把這個(gè)倉(cāng)庫(kù)的 autocrlf 顯式關(guān)掉。但這樣做的代價(jià)是工作區(qū)會(huì)混入倉(cāng)庫(kù)原本的 CRLF下次提交時(shí)又把臟行尾提交進(jìn)去治標(biāo)不治本。我的建議始終是全局配置用默認(rèn) true倉(cāng)庫(kù)規(guī)則交給 .gitattributes兩邊各管一段。3.3 SSH 密鑰與憑證助手換機(jī)器后最常翻車的這步連接遠(yuǎn)程倉(cāng)庫(kù)時(shí)推薦用 SSH 而非 HTTPS因?yàn)槊荑€比密碼好管理。在 Git Bash 里生成密鑰ssh-keygen -t ed25519 -C 你的郵箱 -f ~/.ssh/id_ed25519-t ed25519 比默認(rèn)的 rsa 更小更快V2.35 的底層 OpenSSH 支持沒(méi)問(wèn)題。如果你要連的是老舊服務(wù)器才需要退回 rsa 4096。生成后把 ~/.ssh/id_ed25519.pub 的內(nèi)容粘貼到代碼托管平臺(tái)的 SSH keys 設(shè)置里。注意在多臺(tái)電腦場(chǎng)景下不建議把同一份私鑰往機(jī)器間復(fù)制。正確做法是每臺(tái)機(jī)器各自生成密鑰對(duì)把各自的公鑰都配到賬號(hào)下哪天某臺(tái)機(jī)器丟了吊銷那一把公鑰就行其他機(jī)器不受影響。如果你偏好更省事的方式也可以把私鑰放進(jìn)隨身目錄、配一個(gè) ssh-agent 統(tǒng)一管理。具體來(lái)說(shuō)在 .bashrc 里加一句 eval $(ssh-agent) 再 ssh-addGit Bash 每次啟動(dòng)自動(dòng)加載密鑰輸一次口令之后一個(gè)會(huì)話內(nèi)都不用再輸。這個(gè)方案適合密鑰有口令保護(hù)的人丟 U 盤也不至于直接泄露。憑證方面V2.35 的默認(rèn)憑證助手是 manager-core它在完整版 Windows 上表現(xiàn)正常但一些精簡(jiǎn)過(guò)的系統(tǒng)缺少運(yùn)行庫(kù)git pull 時(shí)會(huì)一直彈窗或直接報(bào)找不到 git-credential-manager-core。遇到這種情況最省事的后備方案是切到 store 模式git config --global credential.helper storestore 模式把憑證明文寫在 ~/.git-credentials好處是命令不彈窗、一次性配好壞處是明文風(fēng)險(xiǎn)。我的處理方法是只在可信的內(nèi)網(wǎng)倉(cāng)庫(kù)或者臨時(shí)環(huán)境用 store離開(kāi)前記得刪掉這個(gè)文件。還有一點(diǎn)容易被忽略切換憑證助手后已經(jīng)緩存過(guò)的老憑證不會(huì)立刻失效如果 push 后發(fā)現(xiàn)還在用舊賬號(hào)就去 Windows 的「憑證管理器」里把對(duì)應(yīng)條目刪掉再重試。憑證助手選型上我一般先試默認(rèn)的 manager-core它彈窗次數(shù)最少報(bào)錯(cuò)再降級(jí)到 store而不是一開(kāi)始就用 store。4. 常見(jiàn)問(wèn)題與避坑部署和日常使用中的五個(gè)翻車點(diǎn)4.1 部署階段閃退與 PATH 搶占現(xiàn)象一雙擊 git-bash.exe 閃退命令行窗口一閃就沒(méi)了。原因大概率是安全軟件把 PortableGit 的關(guān)鍵 dll 或者 usr/bin 下的可執(zhí)行文件隔離了。解壓動(dòng)作觸發(fā)實(shí)時(shí)掃描文件剛落地就被帶走bash 起不來(lái)。解決先把壓縮包放到本地磁盤再解壓解壓時(shí)臨時(shí)退出安全軟件解壓完成后把目錄加白名單。還有個(gè)小概率原因是解壓到網(wǎng)絡(luò)路徑或權(quán)限受限的系統(tǒng)目錄把 PortableGit 放到用戶有完整讀寫權(quán)限的位置?,F(xiàn)象二在 cmd 里敲 git --version顯示的版本不是 V2.35而是系統(tǒng)里另一個(gè)老 Git。原因不是 PortableGit 沒(méi)裝好是 PATH 檢索順序里系統(tǒng)的 Git 目錄排在前面。解決用 where git 列出所有候選然后把 PortableGit 的 cmd 目錄在用戶 PATH 里往前調(diào)。如果始終有小工具優(yōu)先調(diào)用系統(tǒng)目錄最直接的辦法就是在調(diào)用時(shí)寫完整路徑后面腳本化調(diào)用時(shí)我會(huì)這么做。4.2 日常使用階段換行符告警與終端找不到 git現(xiàn)象三每次 git add 都提示 LF will be replaced by CRLF 或者反過(guò)來(lái)看著煩偶爾還擔(dān)心是否改了文件。原因就是 core.autocrlf 和倉(cāng)庫(kù)已有文件的行尾不匹配。這通常不是錯(cuò)誤只是提示但大量告警會(huì)掩蓋真正的報(bào)錯(cuò)。解決先把倉(cāng)庫(kù)根目錄的 .gitattributes 立起來(lái)讓規(guī)則入庫(kù)本地再確認(rèn) autocrlf 不是 false。規(guī)則改完后跑一次 git add --renormalize . 讓 Git 按新規(guī)則重新規(guī)范化索引里的行尾然后提交一次告警基本消失。如果遲遲不動(dòng) .gitattributes只是每次告警時(shí)手動(dòng)忽略倉(cāng)庫(kù)里就會(huì)慢慢混入兩種行尾的文件最終某天 git diff 出現(xiàn)整文件級(jí)別的改動(dòng)那時(shí)候已經(jīng)分不清是真實(shí)改動(dòng)還是行尾漂移。換行符的問(wèn)題不能拖越拖越難收拾?,F(xiàn)象四明明 PATH 已經(jīng)加進(jìn)系統(tǒng)設(shè)置PowerShell 里 git 還是「無(wú)法識(shí)別」。原因當(dāng)前終端會(huì)話啟動(dòng)時(shí) PATH 已經(jīng)加載系統(tǒng)設(shè)置的修改不會(huì)自動(dòng)進(jìn)入已經(jīng)打開(kāi)的會(huì)話。解決有兩種重開(kāi)終端讓新 PATH 生效或者只對(duì)當(dāng)前會(huì)話臨時(shí)刷新。別在一開(kāi)著的窗口里反復(fù)測(cè)驗(yàn)這會(huì)讓人誤以為配置壞了。在 PowerShell 里臨時(shí)生效的命令是 $env:Path D:\portable-git\cmd; $env:Path加了之后就立即能用只是重啟終端會(huì)失效。這個(gè)坑最常見(jiàn)的翻車場(chǎng)景是改了環(huán)境變量后編輯器或 IDE 里集成的終端不重啟直接調(diào) git 報(bào)錯(cuò)于是以為配置沒(méi)寫進(jìn)去。實(shí)際上環(huán)境變量寫成功了只是當(dāng)前進(jìn)程沒(méi)拿到新值。工具鏈里的每一個(gè)進(jìn)程都應(yīng)該重啟不光是終端窗口本身。4.3 配置遷移HOME 改了但 .ssh 沒(méi)跟上現(xiàn)象五給 PortableGit 指向自定義 HOME 后ssh 連接遠(yuǎn)程倉(cāng)庫(kù)提示找不到身份文件或者讓輸入密碼。原因HOME 變量被改了git 和 ssh 都去新 HOME 找 .ssh/id_ed25519但新目錄下沒(méi)有 .ssh 文件夾密鑰不在那里。解決把整個(gè) .ssh 目錄搬過(guò)去同時(shí)注意 Windows 上私鑰文件的權(quán)限要收緊或者用 core.sshCommand 顯式指定密鑰路徑git config --global core.sshCommand ssh -i D:/portable-git/home/.ssh/id_ed25519這個(gè)設(shè)置只影響 Git 調(diào)用 ssh 的方式不影響系統(tǒng)其他 ssh 使用。如果搬完 .ssh 還是不行檢查一下密鑰文件是否帶多余的后綴名OpenSSH 對(duì)文件名敏感多一個(gè)字符都不認(rèn)。還有一件事容易被忽略.ssh 目錄下不能有其他用戶可寫否則 OpenSSH 會(huì)拒用該密鑰Windows 上表現(xiàn)為權(quán)限錯(cuò)誤。打開(kāi)文件屬性把繼承權(quán)限收緊到只剩當(dāng)前用戶。5. 多版本共存與配置遷移把整份環(huán)境粘到 U 盤上5.1 新老版本并存腳本里用絕對(duì)路徑調(diào)用V2.35 和其他 Git 新版本完全可以并存。它們各自解壓到獨(dú)立目錄互不干擾只要 PATH 里只放其中一份就不會(huì)有沖突。全局配置默認(rèn)共用同一份 $HOME/.gitconfig如果你想隔離把 HOME 分開(kāi)指向兩個(gè)目錄即可。用共享配置也不需要擔(dān)心格式問(wèn)題Git 配置格式向后兼容老版本讀新配置文件可能會(huì)有未知字段告警但基本不影響主流程。腳本里調(diào)用時(shí)不建議依賴 PATH 解析寫絕對(duì)路徑最穩(wěn)D:\git235\cmd\git.exe -C D:\workspace\project status D:\git\cmd\git.exe -C D:\workspace\project log -1 --oneline-C 指定倉(cāng)庫(kù)目錄即使當(dāng)前目錄不在倉(cāng)庫(kù)里也能正確執(zhí)行。這個(gè)方法也順便繞開(kāi)了 PATH 順序問(wèn)題無(wú)論系統(tǒng) PATH 里還有沒(méi)有別的 Git腳本都只執(zhí)行你指定的這一份。我一般會(huì)做一個(gè)環(huán)境變量 GIT235 和 GITNEW 指向兩個(gè)目錄腳本里寫成 $GIT235\cmd\git.exe路徑出現(xiàn)變化時(shí)只改變量不改腳本。切換版本的另一個(gè)入口是 git-bash.exe 本身新老版本的終端窗口完全獨(dú)立不會(huì)互相干擾。我實(shí)際用下來(lái)最省心的方式不是日常頻繁切而是固定一份作為默認(rèn)另一份只在特定項(xiàng)目或排查問(wèn)題時(shí)啟用。便攜版的優(yōu)勢(shì)就在于切版本的成本只是換一個(gè)目錄不是卸載重裝。5.2 配置隨身走把 HOME 指到一個(gè) dotfiles 目錄規(guī)劃一個(gè)目錄比如 D:\dev\dotfiles把 .gitconfig、.ssh、.gitignore_global 放進(jìn)去。然后在系統(tǒng)環(huán)境變量里把 HOME 指向這個(gè)目錄。注意HOME 這個(gè)變量在 Windows 上默認(rèn)不存在系統(tǒng)用的是 USERPROFILE但 Git Bash 和 OpenSSH 認(rèn) HOME。我在多臺(tái)機(jī)器上就是這么干的解壓 PortableGit改掉 HOMEgit 的全局配置、密鑰、別名全部復(fù)活。# .gitconfig 片段示例 [user] name your-name email your-email [core] autocrlf true excludesfile ~/.gitignore_global [alias] co checkout st status lg log --oneline --graph --all -15這個(gè)文件涵蓋了用戶名、行尾策略、全局忽略文件和最常用的別名。.gitignore_global 里放的是個(gè)人通用的忽略規(guī)則比如 .idea、*.suo、Thumbs.db 這類編輯器或系統(tǒng)文件。SSH 方面把 id_ed25519、id_ed25519.pub、known_hosts 三個(gè)文件放進(jìn) .ssh 目錄之后連接新主機(jī)時(shí) known_hosts 也會(huì)自動(dòng)更新不用每臺(tái)機(jī)器重新確認(rèn)指紋。配置袋里還可以放一個(gè) .bashrcPortableGit 的 Git Bash 啟動(dòng)時(shí)會(huì)自動(dòng)加載用戶目錄下的 .bashrc。我一般會(huì)在里面加幾條 PATH 追加和 alias比如把 PortableGit 的 cmd 目錄加進(jìn)去、定義 ll 這樣的簡(jiǎn)寫。這樣換機(jī)器后打開(kāi)終端第一眼看到的提示符都是熟悉的樣子這種細(xì)節(jié)比大功能更影響使用心情。5.3 用 init 腳本一鍵還原 PortableGit 環(huán)境有了上面的配置袋換到一臺(tái)新機(jī)器只需要三步解壓 PortableGit把 dotfiles 目錄放到位跑一個(gè) init 腳本。bat 腳本可以寫成這樣echo off setx HOME D:\dev\dotfiles setx PATH %PATH%;D:\portable-git\cmd git config --global core.excludesfile %HOME%\.gitignore_global echo done第一行把 HOME 固定到配置袋第二行把 cmd 加進(jìn) PATH第三行關(guān)聯(lián)全局忽略文件。注意這里用 setx 有 1024 字符風(fēng)險(xiǎn)嚴(yán)格一點(diǎn)的做法是用之前提到的 PowerShell SetEnvironmentVariable 只改用戶作用域。跑完之后重開(kāi)終端git --version 和 ssh -T 分別驗(yàn)證配置與連接。ssh -T 的返回信息因托管平臺(tái)而異但只要提示認(rèn)證成功就說(shuō)明公鑰和私鑰配對(duì)正常。這套流程我實(shí)際跑過(guò)很多次從解壓到全部配置生效五分鐘以內(nèi)能完成。init 腳本本質(zhì)上是一份部署清單它把手動(dòng)配置過(guò)程中容易漏掉的步驟固化下來(lái)避免每次換機(jī)器都要重新回憶一遍。腳本本身也會(huì)跟著 dotfiles 一起走U 盤拷到哪都能用。如果你希望更自動(dòng)化還可以把 PortableGit 壓縮包一起放進(jìn) U 盤整個(gè)環(huán)境就是目錄 腳本 配置袋三層結(jié)構(gòu)三層各司其職。6. 再進(jìn)一步用 PortableGit 的 bash 跑一套自包含構(gòu)建腳本到了這一步你已經(jīng)擁有了一個(gè)完全獨(dú)立的 Git 環(huán)境接下來(lái)可以把它當(dāng)成構(gòu)建工具鏈的一部分來(lái)用。我經(jīng)常會(huì)寫一個(gè)自包含的 build.sh用 PortableGit 的 bash 執(zhí)行讓腳本不依賴系統(tǒng)是否裝了 Git也不怕系統(tǒng)里的 Git 版本太老、語(yǔ)法不支持。#!/usr/bin/env bash set -euo pipefail export HOMED:/dev/dotfiles export PATH/d/portable-git/cmd:$PATH VERSION$(git describe --tags --always --dirty) echo build version: $VERSION # 這里放你的編譯、打包、產(chǎn)物輸出命令 # 例如用 tar 打包源碼目錄 tar -czf dist/$(basename $PWD)-$VERSION.tar.gz src/調(diào)用方式固定走 PortableGit 的 bash不經(jīng)過(guò)系統(tǒng)注冊(cè)的 gitD:\portable-git\usr\bin\bash.exe --login D:\workspace\project\build.sh--login 會(huì)讓 bash 加載 /etc/profile 和 ~/.bashrc這樣 unix 工具鏈和自定義 PATH 都齊了。腳本第一行把 PortableGit 的 cmd 目錄放在 PATH 最前面保證腳本內(nèi)部所有的 git 調(diào)用都命中 V2.35而不是系統(tǒng)里的舊版本。即使系統(tǒng)裝了別的 Git這個(gè)腳本也完全不受影響這就是自包含的含義。我過(guò)去吃過(guò)一次虧在某臺(tái)機(jī)器上跑項(xiàng)目腳本腳本里直接寫 git 命令系統(tǒng)里裝著老版本 Git解析不了新語(yǔ)法直接崩掉排查半天才發(fā)現(xiàn)調(diào)的是系統(tǒng) Git 而不是項(xiàng)目指定的便攜版。從那以后我每次跑構(gòu)建腳本前都強(qiáng)制確認(rèn) bash.exe 的絕對(duì)路徑腳本里也顯式把 PortableGit 的 cmd 放在 PATH 第一位。從那以后我每次跑構(gòu)建腳本前都強(qiáng)制確認(rèn) bash.exe 的絕對(duì)路徑腳本里也顯式把 PortableGit 的 cmd 放在 PATH 第一位。把這套做法固定下來(lái)構(gòu)建就再也不受環(huán)境差異影響了。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取