[{"data":1,"prerenderedAt":10880},["ShallowReactive",2],{"sidebar-page":3,"tag-备忘录":4},null,[5,2358,8001],{"id":6,"title":7,"author":8,"body":9,"cover":3,"date":2348,"description":15,"extension":2349,"meta":2350,"navigation":81,"path":2351,"seo":2352,"stem":2353,"tags":2354,"__hash__":2357},"content\u002Fgit-memo-2026-09-25.md","Git 备忘录","AeYunDian",{"type":10,"value":11,"toc":2317},"minimark",[12,16,21,251,255,368,372,439,443,630,633,711,721,725,728,802,805,859,862,906,909,1001,1004,1039,1049,1053,1155,1158,1162,1328,1340,1344,1441,1445,1589,1593,1597,1616,1619,1644,1648,1694,1698,1738,1742,1785,1788,1810,1814,1825,1855,1858,1862,1902,1912,1916,1924,1927,2021,2024,2030,2034,2218,2222,2275,2278,2281,2284,2314],[13,14,15],"p",{},"日常高频命令速查。按\"场景\"而非\"命令字母\"组织，便于出问题时直接翻。",[17,18,20],"h2",{"id":19},"一配置","一、配置",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-bash shiki shiki-themes monokai","# 用户信息（全局）\ngit config --global user.name \"Your Name\"\ngit config --global user.email \"you@example.com\"\n\n# 换行符（Windows 推荐）\ngit config --global core.autocrlf true\n\n# 中文文件名不乱码\ngit config --global core.quotepath false\n\n# 默认分支名\ngit config --global init.defaultBranch main\n\n# 常用别名\ngit config --global alias.st status\ngit config --global alias.co checkout\ngit config --global alias.br branch\ngit config --global alias.lg \"log --oneline --graph --decorate --all\"\n\n# 查看所有配置\ngit config --list --show-origin\n","bash","",[29,30,31,40,61,76,83,89,104,109,115,130,135,141,156,161,167,182,197,212,227,232,238],"code",{"__ignoreMap":27},[32,33,36],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"snpHw","# 用户信息（全局）\n",[32,41,43,47,51,55,58],{"class":34,"line":42},2,[32,44,46],{"class":45},"sHkqI","git",[32,48,50],{"class":49},"s_Ekj"," config",[32,52,54],{"class":53},"s7s5_"," --global",[32,56,57],{"class":49}," user.name",[32,59,60],{"class":49}," \"Your Name\"\n",[32,62,64,66,68,70,73],{"class":34,"line":63},3,[32,65,46],{"class":45},[32,67,50],{"class":49},[32,69,54],{"class":53},[32,71,72],{"class":49}," user.email",[32,74,75],{"class":49}," \"you@example.com\"\n",[32,77,79],{"class":34,"line":78},4,[32,80,82],{"emptyLinePlaceholder":81},true,"\n",[32,84,86],{"class":34,"line":85},5,[32,87,88],{"class":38},"# 换行符（Windows 推荐）\n",[32,90,92,94,96,98,101],{"class":34,"line":91},6,[32,93,46],{"class":45},[32,95,50],{"class":49},[32,97,54],{"class":53},[32,99,100],{"class":49}," core.autocrlf",[32,102,103],{"class":53}," true\n",[32,105,107],{"class":34,"line":106},7,[32,108,82],{"emptyLinePlaceholder":81},[32,110,112],{"class":34,"line":111},8,[32,113,114],{"class":38},"# 中文文件名不乱码\n",[32,116,118,120,122,124,127],{"class":34,"line":117},9,[32,119,46],{"class":45},[32,121,50],{"class":49},[32,123,54],{"class":53},[32,125,126],{"class":49}," core.quotepath",[32,128,129],{"class":53}," false\n",[32,131,133],{"class":34,"line":132},10,[32,134,82],{"emptyLinePlaceholder":81},[32,136,138],{"class":34,"line":137},11,[32,139,140],{"class":38},"# 默认分支名\n",[32,142,144,146,148,150,153],{"class":34,"line":143},12,[32,145,46],{"class":45},[32,147,50],{"class":49},[32,149,54],{"class":53},[32,151,152],{"class":49}," init.defaultBranch",[32,154,155],{"class":49}," main\n",[32,157,159],{"class":34,"line":158},13,[32,160,82],{"emptyLinePlaceholder":81},[32,162,164],{"class":34,"line":163},14,[32,165,166],{"class":38},"# 常用别名\n",[32,168,170,172,174,176,179],{"class":34,"line":169},15,[32,171,46],{"class":45},[32,173,50],{"class":49},[32,175,54],{"class":53},[32,177,178],{"class":49}," alias.st",[32,180,181],{"class":49}," status\n",[32,183,185,187,189,191,194],{"class":34,"line":184},16,[32,186,46],{"class":45},[32,188,50],{"class":49},[32,190,54],{"class":53},[32,192,193],{"class":49}," alias.co",[32,195,196],{"class":49}," checkout\n",[32,198,200,202,204,206,209],{"class":34,"line":199},17,[32,201,46],{"class":45},[32,203,50],{"class":49},[32,205,54],{"class":53},[32,207,208],{"class":49}," alias.br",[32,210,211],{"class":49}," branch\n",[32,213,215,217,219,221,224],{"class":34,"line":214},18,[32,216,46],{"class":45},[32,218,50],{"class":49},[32,220,54],{"class":53},[32,222,223],{"class":49}," alias.lg",[32,225,226],{"class":49}," \"log --oneline --graph --decorate --all\"\n",[32,228,230],{"class":34,"line":229},19,[32,231,82],{"emptyLinePlaceholder":81},[32,233,235],{"class":34,"line":234},20,[32,236,237],{"class":38},"# 查看所有配置\n",[32,239,241,243,245,248],{"class":34,"line":240},21,[32,242,46],{"class":45},[32,244,50],{"class":49},[32,246,247],{"class":53}," --list",[32,249,250],{"class":53}," --show-origin\n",[17,252,254],{"id":253},"二基础工作流","二、基础工作流",[22,256,258],{"className":24,"code":257,"language":26,"meta":27,"style":27},"git status                    # 查看工作区状态\ngit add \u003Cfile>                # 暂存指定文件\ngit add .                     # 暂存所有改动（不含删除）\ngit add -A                    # 暂存所有改动（含删除）\ngit commit -m \"message\"       # 提交\ngit commit -am \"message\"      # 跳过 add，直接提交已跟踪文件\ngit push                      # 推送\ngit pull                      # 拉取并合并\n",[29,259,260,270,294,306,318,334,348,358],{"__ignoreMap":27},[32,261,262,264,267],{"class":34,"line":35},[32,263,46],{"class":45},[32,265,266],{"class":49}," status",[32,268,269],{"class":38},"                    # 查看工作区状态\n",[32,271,272,274,277,281,284,288,291],{"class":34,"line":42},[32,273,46],{"class":45},[32,275,276],{"class":49}," add",[32,278,280],{"class":279},"s8I7P"," \u003C",[32,282,283],{"class":49},"fil",[32,285,287],{"class":286},"sCdxs","e",[32,289,290],{"class":279},">",[32,292,293],{"class":38},"                # 暂存指定文件\n",[32,295,296,298,300,303],{"class":34,"line":63},[32,297,46],{"class":45},[32,299,276],{"class":49},[32,301,302],{"class":49}," .",[32,304,305],{"class":38},"                     # 暂存所有改动（不含删除）\n",[32,307,308,310,312,315],{"class":34,"line":78},[32,309,46],{"class":45},[32,311,276],{"class":49},[32,313,314],{"class":53}," -A",[32,316,317],{"class":38},"                    # 暂存所有改动（含删除）\n",[32,319,320,322,325,328,331],{"class":34,"line":85},[32,321,46],{"class":45},[32,323,324],{"class":49}," commit",[32,326,327],{"class":53}," -m",[32,329,330],{"class":49}," \"message\"",[32,332,333],{"class":38},"       # 提交\n",[32,335,336,338,340,343,345],{"class":34,"line":91},[32,337,46],{"class":45},[32,339,324],{"class":49},[32,341,342],{"class":53}," -am",[32,344,330],{"class":49},[32,346,347],{"class":38},"      # 跳过 add，直接提交已跟踪文件\n",[32,349,350,352,355],{"class":34,"line":106},[32,351,46],{"class":45},[32,353,354],{"class":49}," push",[32,356,357],{"class":38},"                      # 推送\n",[32,359,360,362,365],{"class":34,"line":111},[32,361,46],{"class":45},[32,363,364],{"class":49}," pull",[32,366,367],{"class":38},"                      # 拉取并合并\n",[369,370,371],"h3",{"id":371},"查看差异",[22,373,375],{"className":24,"code":374,"language":26,"meta":27,"style":27},"git diff                      # 工作区 vs 暂存区\ngit diff --staged             # 暂存区 vs 最新提交\ngit diff HEAD                 # 工作区 + 暂存区 vs 最新提交\ngit diff \u003Cbranch1>..\u003Cbranch2> # 两分支差异\n",[29,376,377,387,399,411],{"__ignoreMap":27},[32,378,379,381,384],{"class":34,"line":35},[32,380,46],{"class":45},[32,382,383],{"class":49}," diff",[32,385,386],{"class":38},"                      # 工作区 vs 暂存区\n",[32,388,389,391,393,396],{"class":34,"line":42},[32,390,46],{"class":45},[32,392,383],{"class":49},[32,394,395],{"class":53}," --staged",[32,397,398],{"class":38},"             # 暂存区 vs 最新提交\n",[32,400,401,403,405,408],{"class":34,"line":63},[32,402,46],{"class":45},[32,404,383],{"class":49},[32,406,407],{"class":49}," HEAD",[32,409,410],{"class":38},"                 # 工作区 + 暂存区 vs 最新提交\n",[32,412,413,415,417,419,422,425,428,431,433,436],{"class":34,"line":78},[32,414,46],{"class":45},[32,416,383],{"class":49},[32,418,280],{"class":279},[32,420,421],{"class":49},"branch",[32,423,424],{"class":279},"1>",[32,426,427],{"class":49},"..",[32,429,430],{"class":279},"\u003C",[32,432,421],{"class":49},[32,434,435],{"class":279},"2>",[32,437,438],{"class":38}," # 两分支差异\n",[17,440,442],{"id":441},"三分支","三、分支",[22,444,446],{"className":24,"code":445,"language":26,"meta":27,"style":27},"git branch                    # 查看本地分支\ngit branch -a                 # 查看所有分支（含远程）\ngit branch -vv                # 查看分支及跟踪关系\ngit branch \u003Cname>             # 创建分支\ngit switch \u003Cname>             # 切换分支（新版推荐）\ngit switch -c \u003Cname>          # 创建并切换\ngit checkout -b \u003Cname>        # 同上（旧版写法）\ngit branch -d \u003Cname>          # 删除已合并分支\ngit branch -D \u003Cname>          # 强制删除\ngit branch -m \u003Cold> \u003Cnew>     # 重命名分支\n",[29,447,448,458,470,482,500,518,538,559,579,599],{"__ignoreMap":27},[32,449,450,452,455],{"class":34,"line":35},[32,451,46],{"class":45},[32,453,454],{"class":49}," branch",[32,456,457],{"class":38},"                    # 查看本地分支\n",[32,459,460,462,464,467],{"class":34,"line":42},[32,461,46],{"class":45},[32,463,454],{"class":49},[32,465,466],{"class":53}," -a",[32,468,469],{"class":38},"                 # 查看所有分支（含远程）\n",[32,471,472,474,476,479],{"class":34,"line":63},[32,473,46],{"class":45},[32,475,454],{"class":49},[32,477,478],{"class":53}," -vv",[32,480,481],{"class":38},"                # 查看分支及跟踪关系\n",[32,483,484,486,488,490,493,495,497],{"class":34,"line":78},[32,485,46],{"class":45},[32,487,454],{"class":49},[32,489,280],{"class":279},[32,491,492],{"class":49},"nam",[32,494,287],{"class":286},[32,496,290],{"class":279},[32,498,499],{"class":38},"             # 创建分支\n",[32,501,502,504,507,509,511,513,515],{"class":34,"line":85},[32,503,46],{"class":45},[32,505,506],{"class":49}," switch",[32,508,280],{"class":279},[32,510,492],{"class":49},[32,512,287],{"class":286},[32,514,290],{"class":279},[32,516,517],{"class":38},"             # 切换分支（新版推荐）\n",[32,519,520,522,524,527,529,531,533,535],{"class":34,"line":91},[32,521,46],{"class":45},[32,523,506],{"class":49},[32,525,526],{"class":53}," -c",[32,528,280],{"class":279},[32,530,492],{"class":49},[32,532,287],{"class":286},[32,534,290],{"class":279},[32,536,537],{"class":38},"          # 创建并切换\n",[32,539,540,542,545,548,550,552,554,556],{"class":34,"line":106},[32,541,46],{"class":45},[32,543,544],{"class":49}," checkout",[32,546,547],{"class":53}," -b",[32,549,280],{"class":279},[32,551,492],{"class":49},[32,553,287],{"class":286},[32,555,290],{"class":279},[32,557,558],{"class":38},"        # 同上（旧版写法）\n",[32,560,561,563,565,568,570,572,574,576],{"class":34,"line":111},[32,562,46],{"class":45},[32,564,454],{"class":49},[32,566,567],{"class":53}," -d",[32,569,280],{"class":279},[32,571,492],{"class":49},[32,573,287],{"class":286},[32,575,290],{"class":279},[32,577,578],{"class":38},"          # 删除已合并分支\n",[32,580,581,583,585,588,590,592,594,596],{"class":34,"line":117},[32,582,46],{"class":45},[32,584,454],{"class":49},[32,586,587],{"class":53}," -D",[32,589,280],{"class":279},[32,591,492],{"class":49},[32,593,287],{"class":286},[32,595,290],{"class":279},[32,597,598],{"class":38},"          # 强制删除\n",[32,600,601,603,605,607,609,612,615,617,619,622,625,627],{"class":34,"line":132},[32,602,46],{"class":45},[32,604,454],{"class":49},[32,606,327],{"class":53},[32,608,280],{"class":279},[32,610,611],{"class":49},"ol",[32,613,614],{"class":286},"d",[32,616,290],{"class":279},[32,618,280],{"class":279},[32,620,621],{"class":49},"ne",[32,623,624],{"class":286},"w",[32,626,290],{"class":279},[32,628,629],{"class":38},"     # 重命名分支\n",[369,631,632],{"id":632},"合并与变基",[22,634,636],{"className":24,"code":635,"language":26,"meta":27,"style":27},"git merge \u003Cbranch>            # 合并到当前分支（保留历史）\ngit merge --no-ff \u003Cbranch>    # 强制生成合并提交\ngit rebase \u003Cbranch>           # 变基（线性历史）\ngit rebase -i HEAD~3          # 交互式变基，重写最近 3 条提交\n",[29,637,638,658,678,696],{"__ignoreMap":27},[32,639,640,642,645,647,650,653,655],{"class":34,"line":35},[32,641,46],{"class":45},[32,643,644],{"class":49}," merge",[32,646,280],{"class":279},[32,648,649],{"class":49},"branc",[32,651,652],{"class":286},"h",[32,654,290],{"class":279},[32,656,657],{"class":38},"            # 合并到当前分支（保留历史）\n",[32,659,660,662,664,667,669,671,673,675],{"class":34,"line":42},[32,661,46],{"class":45},[32,663,644],{"class":49},[32,665,666],{"class":53}," --no-ff",[32,668,280],{"class":279},[32,670,649],{"class":49},[32,672,652],{"class":286},[32,674,290],{"class":279},[32,676,677],{"class":38},"    # 强制生成合并提交\n",[32,679,680,682,685,687,689,691,693],{"class":34,"line":63},[32,681,46],{"class":45},[32,683,684],{"class":49}," rebase",[32,686,280],{"class":279},[32,688,649],{"class":49},[32,690,652],{"class":286},[32,692,290],{"class":279},[32,694,695],{"class":38},"           # 变基（线性历史）\n",[32,697,698,700,702,705,708],{"class":34,"line":78},[32,699,46],{"class":45},[32,701,684],{"class":49},[32,703,704],{"class":53}," -i",[32,706,707],{"class":49}," HEAD~3",[32,709,710],{"class":38},"          # 交互式变基，重写最近 3 条提交\n",[712,713,714],"blockquote",{},[13,715,716,720],{},[717,718,719],"strong",{},"原则","：已推送到共享远程的分支不要 rebase；只在本地分支上用。",[17,722,724],{"id":723},"四撤销与回退","四、撤销与回退",[13,726,727],{},"这是最容易踩坑的地方，先分清三种\"撤销\"：",[729,730,731,750],"table",{},[732,733,734],"thead",{},[735,736,737,741,744,747],"tr",{},[738,739,740],"th",{},"命令",[738,742,743],{},"作用范围",[738,745,746],{},"是否修改历史",[738,748,749],{},"使用场景",[751,752,753,770,786],"tbody",{},[735,754,755,761,764,767],{},[756,757,758],"td",{},[29,759,760],{},"git restore",[756,762,763],{},"工作区 \u002F 暂存区",[756,765,766],{},"否",[756,768,769],{},"丢弃未提交的修改",[735,771,772,777,780,783],{},[756,773,774],{},[29,775,776],{},"git reset",[756,778,779],{},"暂存区 \u002F 提交历史",[756,781,782],{},"是",[756,784,785],{},"撤销提交（未推送）",[735,787,788,793,796,799],{},[756,789,790],{},[29,791,792],{},"git revert",[756,794,795],{},"提交历史",[756,797,798],{},"否（新增反向提交）",[756,800,801],{},"撤销已推送的提交",[369,803,804],{"id":804},"丢弃工作区修改",[22,806,808],{"className":24,"code":807,"language":26,"meta":27,"style":27},"git restore \u003Cfile>            # 丢弃单个文件的未暂存修改\ngit restore .                 # 丢弃所有未暂存修改（危险）\ngit checkout -- \u003Cfile>        # 旧版写法\n",[29,809,810,828,839],{"__ignoreMap":27},[32,811,812,814,817,819,821,823,825],{"class":34,"line":35},[32,813,46],{"class":45},[32,815,816],{"class":49}," restore",[32,818,280],{"class":279},[32,820,283],{"class":49},[32,822,287],{"class":286},[32,824,290],{"class":279},[32,826,827],{"class":38},"            # 丢弃单个文件的未暂存修改\n",[32,829,830,832,834,836],{"class":34,"line":42},[32,831,46],{"class":45},[32,833,816],{"class":49},[32,835,302],{"class":49},[32,837,838],{"class":38},"                 # 丢弃所有未暂存修改（危险）\n",[32,840,841,843,845,848,850,852,854,856],{"class":34,"line":63},[32,842,46],{"class":45},[32,844,544],{"class":49},[32,846,847],{"class":53}," --",[32,849,280],{"class":279},[32,851,283],{"class":49},[32,853,287],{"class":286},[32,855,290],{"class":279},[32,857,858],{"class":38},"        # 旧版写法\n",[369,860,861],{"id":861},"取消暂存",[22,863,865],{"className":24,"code":864,"language":26,"meta":27,"style":27},"git restore --staged \u003Cfile>   # 从暂存区移回工作区\ngit reset HEAD \u003Cfile>         # 旧版写法\n",[29,866,867,886],{"__ignoreMap":27},[32,868,869,871,873,875,877,879,881,883],{"class":34,"line":35},[32,870,46],{"class":45},[32,872,816],{"class":49},[32,874,395],{"class":53},[32,876,280],{"class":279},[32,878,283],{"class":49},[32,880,287],{"class":286},[32,882,290],{"class":279},[32,884,885],{"class":38},"   # 从暂存区移回工作区\n",[32,887,888,890,893,895,897,899,901,903],{"class":34,"line":42},[32,889,46],{"class":45},[32,891,892],{"class":49}," reset",[32,894,407],{"class":49},[32,896,280],{"class":279},[32,898,283],{"class":49},[32,900,287],{"class":286},[32,902,290],{"class":279},[32,904,905],{"class":38},"         # 旧版写法\n",[369,907,908],{"id":908},"撤销提交",[22,910,912],{"className":24,"code":911,"language":26,"meta":27,"style":27},"# 保留改动在工作区\ngit reset --soft HEAD~1\n\n# 保留改动在暂存区\ngit reset --mixed HEAD~1      # 默认\n\n# 彻底丢弃改动（危险）\ngit reset --hard HEAD~1\n\n# 撤销已推送的提交（安全）\ngit revert \u003Ccommit-hash>\n",[29,913,914,919,931,935,940,955,959,964,975,979,984],{"__ignoreMap":27},[32,915,916],{"class":34,"line":35},[32,917,918],{"class":38},"# 保留改动在工作区\n",[32,920,921,923,925,928],{"class":34,"line":42},[32,922,46],{"class":45},[32,924,892],{"class":49},[32,926,927],{"class":53}," --soft",[32,929,930],{"class":49}," HEAD~1\n",[32,932,933],{"class":34,"line":63},[32,934,82],{"emptyLinePlaceholder":81},[32,936,937],{"class":34,"line":78},[32,938,939],{"class":38},"# 保留改动在暂存区\n",[32,941,942,944,946,949,952],{"class":34,"line":85},[32,943,46],{"class":45},[32,945,892],{"class":49},[32,947,948],{"class":53}," --mixed",[32,950,951],{"class":49}," HEAD~1",[32,953,954],{"class":38},"      # 默认\n",[32,956,957],{"class":34,"line":91},[32,958,82],{"emptyLinePlaceholder":81},[32,960,961],{"class":34,"line":106},[32,962,963],{"class":38},"# 彻底丢弃改动（危险）\n",[32,965,966,968,970,973],{"class":34,"line":111},[32,967,46],{"class":45},[32,969,892],{"class":49},[32,971,972],{"class":53}," --hard",[32,974,930],{"class":49},[32,976,977],{"class":34,"line":117},[32,978,82],{"emptyLinePlaceholder":81},[32,980,981],{"class":34,"line":132},[32,982,983],{"class":38},"# 撤销已推送的提交（安全）\n",[32,985,986,988,991,993,996,998],{"class":34,"line":137},[32,987,46],{"class":45},[32,989,990],{"class":49}," revert",[32,992,280],{"class":279},[32,994,995],{"class":49},"commit-has",[32,997,652],{"class":286},[32,999,1000],{"class":279},">\n",[369,1002,1003],{"id":1003},"找回丢失的提交",[22,1005,1007],{"className":24,"code":1006,"language":26,"meta":27,"style":27},"git reflog                    # 查看 HEAD 移动历史\ngit reset --hard \u003Chash>       # 回到某个历史位置\n",[29,1008,1009,1019],{"__ignoreMap":27},[32,1010,1011,1013,1016],{"class":34,"line":35},[32,1012,46],{"class":45},[32,1014,1015],{"class":49}," reflog",[32,1017,1018],{"class":38},"                    # 查看 HEAD 移动历史\n",[32,1020,1021,1023,1025,1027,1029,1032,1034,1036],{"class":34,"line":42},[32,1022,46],{"class":45},[32,1024,892],{"class":49},[32,1026,972],{"class":53},[32,1028,280],{"class":279},[32,1030,1031],{"class":49},"has",[32,1033,652],{"class":286},[32,1035,290],{"class":279},[32,1037,1038],{"class":38},"       # 回到某个历史位置\n",[13,1040,1041,1044,1045,1048],{},[29,1042,1043],{},"reset --hard"," 后如果后悔，",[29,1046,1047],{},"reflog"," 通常能救回来，除非已经 GC。",[17,1050,1052],{"id":1051},"五贮藏stash","五、贮藏（stash）",[22,1054,1056],{"className":24,"code":1055,"language":26,"meta":27,"style":27},"git stash                     # 贮藏当前改动\ngit stash -u                  # 含未跟踪文件\ngit stash list                # 查看贮藏列表\ngit stash pop                 # 弹出最近贮藏并删除\ngit stash apply stash@{0}     # 应用指定贮藏（保留）\ngit stash drop stash@{0}      # 删除指定贮藏\ngit stash clear               # 清空所有贮藏\n",[29,1057,1058,1068,1080,1092,1104,1125,1143],{"__ignoreMap":27},[32,1059,1060,1062,1065],{"class":34,"line":35},[32,1061,46],{"class":45},[32,1063,1064],{"class":49}," stash",[32,1066,1067],{"class":38},"                     # 贮藏当前改动\n",[32,1069,1070,1072,1074,1077],{"class":34,"line":42},[32,1071,46],{"class":45},[32,1073,1064],{"class":49},[32,1075,1076],{"class":53}," -u",[32,1078,1079],{"class":38},"                  # 含未跟踪文件\n",[32,1081,1082,1084,1086,1089],{"class":34,"line":63},[32,1083,46],{"class":45},[32,1085,1064],{"class":49},[32,1087,1088],{"class":49}," list",[32,1090,1091],{"class":38},"                # 查看贮藏列表\n",[32,1093,1094,1096,1098,1101],{"class":34,"line":78},[32,1095,46],{"class":45},[32,1097,1064],{"class":49},[32,1099,1100],{"class":49}," pop",[32,1102,1103],{"class":38},"                 # 弹出最近贮藏并删除\n",[32,1105,1106,1108,1110,1113,1116,1119,1122],{"class":34,"line":85},[32,1107,46],{"class":45},[32,1109,1064],{"class":49},[32,1111,1112],{"class":49}," apply",[32,1114,1115],{"class":49}," stash@{",[32,1117,1118],{"class":53},"0",[32,1120,1121],{"class":49},"}",[32,1123,1124],{"class":38},"     # 应用指定贮藏（保留）\n",[32,1126,1127,1129,1131,1134,1136,1138,1140],{"class":34,"line":91},[32,1128,46],{"class":45},[32,1130,1064],{"class":49},[32,1132,1133],{"class":49}," drop",[32,1135,1115],{"class":49},[32,1137,1118],{"class":53},[32,1139,1121],{"class":49},[32,1141,1142],{"class":38},"      # 删除指定贮藏\n",[32,1144,1145,1147,1149,1152],{"class":34,"line":106},[32,1146,46],{"class":45},[32,1148,1064],{"class":49},[32,1150,1151],{"class":49}," clear",[32,1153,1154],{"class":38},"               # 清空所有贮藏\n",[13,1156,1157],{},"常见场景：改了一半，突然要切分支修 bug。",[17,1159,1161],{"id":1160},"六远程","六、远程",[22,1163,1165],{"className":24,"code":1164,"language":26,"meta":27,"style":27},"git remote -v                 # 查看远程仓库\ngit remote add origin \u003Curl>   # 添加远程\ngit remote set-url origin \u003Curl> # 修改远程地址\ngit remote remove origin      # 删除远程\n\ngit fetch                     # 拉取远程信息，不合并\ngit pull                      # fetch + merge\ngit pull --rebase             # fetch + rebase\ngit push                      # 推送\ngit push -u origin \u003Cbranch>   # 首次推送并建立跟踪\ngit push --force-with-lease   # 安全强推（推荐）\ngit push --force              # 强推（危险）\n",[29,1166,1167,1180,1204,1226,1240,1244,1254,1263,1275,1283,1304,1316],{"__ignoreMap":27},[32,1168,1169,1171,1174,1177],{"class":34,"line":35},[32,1170,46],{"class":45},[32,1172,1173],{"class":49}," remote",[32,1175,1176],{"class":53}," -v",[32,1178,1179],{"class":38},"                 # 查看远程仓库\n",[32,1181,1182,1184,1186,1188,1191,1193,1196,1199,1201],{"class":34,"line":42},[32,1183,46],{"class":45},[32,1185,1173],{"class":49},[32,1187,276],{"class":49},[32,1189,1190],{"class":49}," origin",[32,1192,280],{"class":279},[32,1194,1195],{"class":49},"ur",[32,1197,1198],{"class":286},"l",[32,1200,290],{"class":279},[32,1202,1203],{"class":38},"   # 添加远程\n",[32,1205,1206,1208,1210,1213,1215,1217,1219,1221,1223],{"class":34,"line":63},[32,1207,46],{"class":45},[32,1209,1173],{"class":49},[32,1211,1212],{"class":49}," set-url",[32,1214,1190],{"class":49},[32,1216,280],{"class":279},[32,1218,1195],{"class":49},[32,1220,1198],{"class":286},[32,1222,290],{"class":279},[32,1224,1225],{"class":38}," # 修改远程地址\n",[32,1227,1228,1230,1232,1235,1237],{"class":34,"line":78},[32,1229,46],{"class":45},[32,1231,1173],{"class":49},[32,1233,1234],{"class":49}," remove",[32,1236,1190],{"class":49},[32,1238,1239],{"class":38},"      # 删除远程\n",[32,1241,1242],{"class":34,"line":85},[32,1243,82],{"emptyLinePlaceholder":81},[32,1245,1246,1248,1251],{"class":34,"line":91},[32,1247,46],{"class":45},[32,1249,1250],{"class":49}," fetch",[32,1252,1253],{"class":38},"                     # 拉取远程信息，不合并\n",[32,1255,1256,1258,1260],{"class":34,"line":106},[32,1257,46],{"class":45},[32,1259,364],{"class":49},[32,1261,1262],{"class":38},"                      # fetch + merge\n",[32,1264,1265,1267,1269,1272],{"class":34,"line":111},[32,1266,46],{"class":45},[32,1268,364],{"class":49},[32,1270,1271],{"class":53}," --rebase",[32,1273,1274],{"class":38},"             # fetch + rebase\n",[32,1276,1277,1279,1281],{"class":34,"line":117},[32,1278,46],{"class":45},[32,1280,354],{"class":49},[32,1282,357],{"class":38},[32,1284,1285,1287,1289,1291,1293,1295,1297,1299,1301],{"class":34,"line":132},[32,1286,46],{"class":45},[32,1288,354],{"class":49},[32,1290,1076],{"class":53},[32,1292,1190],{"class":49},[32,1294,280],{"class":279},[32,1296,649],{"class":49},[32,1298,652],{"class":286},[32,1300,290],{"class":279},[32,1302,1303],{"class":38},"   # 首次推送并建立跟踪\n",[32,1305,1306,1308,1310,1313],{"class":34,"line":137},[32,1307,46],{"class":45},[32,1309,354],{"class":49},[32,1311,1312],{"class":53}," --force-with-lease",[32,1314,1315],{"class":38},"   # 安全强推（推荐）\n",[32,1317,1318,1320,1322,1325],{"class":34,"line":143},[32,1319,46],{"class":45},[32,1321,354],{"class":49},[32,1323,1324],{"class":53}," --force",[32,1326,1327],{"class":38},"              # 强推（危险）\n",[712,1329,1330],{},[13,1331,1332,1335,1336,1339],{},[717,1333,1334],{},"强推原则","：永远用 ",[29,1337,1338],{},"--force-with-lease","，它会检查远程是否有人推过新提交，避免误覆盖别人的工作。",[17,1341,1343],{"id":1342},"七标签","七、标签",[22,1345,1347],{"className":24,"code":1346,"language":26,"meta":27,"style":27},"git tag                       # 查看标签\ngit tag v1.0.0                # 轻量标签\ngit tag -a v1.0.0 -m \"msg\"    # 附注标签（推荐）\ngit push origin v1.0.0        # 推送单个标签\ngit push --tags               # 推送所有标签\ngit tag -d v1.0.0             # 删除本地标签\ngit push origin :refs\u002Ftags\u002Fv1.0.0  # 删除远程标签\n",[29,1348,1349,1359,1371,1389,1402,1414,1427],{"__ignoreMap":27},[32,1350,1351,1353,1356],{"class":34,"line":35},[32,1352,46],{"class":45},[32,1354,1355],{"class":49}," tag",[32,1357,1358],{"class":38},"                       # 查看标签\n",[32,1360,1361,1363,1365,1368],{"class":34,"line":42},[32,1362,46],{"class":45},[32,1364,1355],{"class":49},[32,1366,1367],{"class":49}," v1.0.0",[32,1369,1370],{"class":38},"                # 轻量标签\n",[32,1372,1373,1375,1377,1379,1381,1383,1386],{"class":34,"line":63},[32,1374,46],{"class":45},[32,1376,1355],{"class":49},[32,1378,466],{"class":53},[32,1380,1367],{"class":49},[32,1382,327],{"class":53},[32,1384,1385],{"class":49}," \"msg\"",[32,1387,1388],{"class":38},"    # 附注标签（推荐）\n",[32,1390,1391,1393,1395,1397,1399],{"class":34,"line":78},[32,1392,46],{"class":45},[32,1394,354],{"class":49},[32,1396,1190],{"class":49},[32,1398,1367],{"class":49},[32,1400,1401],{"class":38},"        # 推送单个标签\n",[32,1403,1404,1406,1408,1411],{"class":34,"line":85},[32,1405,46],{"class":45},[32,1407,354],{"class":49},[32,1409,1410],{"class":53}," --tags",[32,1412,1413],{"class":38},"               # 推送所有标签\n",[32,1415,1416,1418,1420,1422,1424],{"class":34,"line":91},[32,1417,46],{"class":45},[32,1419,1355],{"class":49},[32,1421,567],{"class":53},[32,1423,1367],{"class":49},[32,1425,1426],{"class":38},"             # 删除本地标签\n",[32,1428,1429,1431,1433,1435,1438],{"class":34,"line":106},[32,1430,46],{"class":45},[32,1432,354],{"class":49},[32,1434,1190],{"class":49},[32,1436,1437],{"class":49}," :refs\u002Ftags\u002Fv1.0.0",[32,1439,1440],{"class":38},"  # 删除远程标签\n",[17,1442,1444],{"id":1443},"八查看历史","八、查看历史",[22,1446,1448],{"className":24,"code":1447,"language":26,"meta":27,"style":27},"git log                       # 完整日志\ngit log --oneline             # 单行\ngit log --oneline --graph     # 图形化\ngit log -p \u003Cfile>             # 查看某文件历史\ngit log --author=\"name\"       # 按作者过滤\ngit log --since=\"2 weeks ago\" # 按时间过滤\ngit log -S \"keyword\"          # 按内容变化搜索（pickaxe）\ngit blame \u003Cfile>              # 逐行查看最后修改者\ngit show \u003Ccommit>             # 查看某次提交详情\n",[29,1449,1450,1460,1472,1486,1506,1521,1536,1551,1569],{"__ignoreMap":27},[32,1451,1452,1454,1457],{"class":34,"line":35},[32,1453,46],{"class":45},[32,1455,1456],{"class":49}," log",[32,1458,1459],{"class":38},"                       # 完整日志\n",[32,1461,1462,1464,1466,1469],{"class":34,"line":42},[32,1463,46],{"class":45},[32,1465,1456],{"class":49},[32,1467,1468],{"class":53}," --oneline",[32,1470,1471],{"class":38},"             # 单行\n",[32,1473,1474,1476,1478,1480,1483],{"class":34,"line":63},[32,1475,46],{"class":45},[32,1477,1456],{"class":49},[32,1479,1468],{"class":53},[32,1481,1482],{"class":53}," --graph",[32,1484,1485],{"class":38},"     # 图形化\n",[32,1487,1488,1490,1492,1495,1497,1499,1501,1503],{"class":34,"line":78},[32,1489,46],{"class":45},[32,1491,1456],{"class":49},[32,1493,1494],{"class":53}," -p",[32,1496,280],{"class":279},[32,1498,283],{"class":49},[32,1500,287],{"class":286},[32,1502,290],{"class":279},[32,1504,1505],{"class":38},"             # 查看某文件历史\n",[32,1507,1508,1510,1512,1515,1518],{"class":34,"line":85},[32,1509,46],{"class":45},[32,1511,1456],{"class":49},[32,1513,1514],{"class":53}," --author=",[32,1516,1517],{"class":49},"\"name\"",[32,1519,1520],{"class":38},"       # 按作者过滤\n",[32,1522,1523,1525,1527,1530,1533],{"class":34,"line":91},[32,1524,46],{"class":45},[32,1526,1456],{"class":49},[32,1528,1529],{"class":53}," --since=",[32,1531,1532],{"class":49},"\"2 weeks ago\"",[32,1534,1535],{"class":38}," # 按时间过滤\n",[32,1537,1538,1540,1542,1545,1548],{"class":34,"line":106},[32,1539,46],{"class":45},[32,1541,1456],{"class":49},[32,1543,1544],{"class":53}," -S",[32,1546,1547],{"class":49}," \"keyword\"",[32,1549,1550],{"class":38},"          # 按内容变化搜索（pickaxe）\n",[32,1552,1553,1555,1558,1560,1562,1564,1566],{"class":34,"line":111},[32,1554,46],{"class":45},[32,1556,1557],{"class":49}," blame",[32,1559,280],{"class":279},[32,1561,283],{"class":49},[32,1563,287],{"class":286},[32,1565,290],{"class":279},[32,1567,1568],{"class":38},"              # 逐行查看最后修改者\n",[32,1570,1571,1573,1576,1578,1581,1584,1586],{"class":34,"line":117},[32,1572,46],{"class":45},[32,1574,1575],{"class":49}," show",[32,1577,280],{"class":279},[32,1579,1580],{"class":49},"commi",[32,1582,1583],{"class":286},"t",[32,1585,290],{"class":279},[32,1587,1588],{"class":38},"             # 查看某次提交详情\n",[17,1590,1592],{"id":1591},"九常见问题","九、常见问题",[369,1594,1596],{"id":1595},"_1-提交信息写错了未推送","1. 提交信息写错了（未推送）",[22,1598,1600],{"className":24,"code":1599,"language":26,"meta":27,"style":27},"git commit --amend -m \"new message\"\n",[29,1601,1602],{"__ignoreMap":27},[32,1603,1604,1606,1608,1611,1613],{"class":34,"line":35},[32,1605,46],{"class":45},[32,1607,324],{"class":49},[32,1609,1610],{"class":53}," --amend",[32,1612,327],{"class":53},[32,1614,1615],{"class":49}," \"new message\"\n",[13,1617,1618],{},"如果只是想补充文件：",[22,1620,1622],{"className":24,"code":1621,"language":26,"meta":27,"style":27},"git add forgotten.txt\ngit commit --amend --no-edit\n",[29,1623,1624,1633],{"__ignoreMap":27},[32,1625,1626,1628,1630],{"class":34,"line":35},[32,1627,46],{"class":45},[32,1629,276],{"class":49},[32,1631,1632],{"class":49}," forgotten.txt\n",[32,1634,1635,1637,1639,1641],{"class":34,"line":42},[32,1636,46],{"class":45},[32,1638,324],{"class":49},[32,1640,1610],{"class":53},[32,1642,1643],{"class":53}," --no-edit\n",[369,1645,1647],{"id":1646},"_2-提交到了错误的分支","2. 提交到了错误的分支",[22,1649,1651],{"className":24,"code":1650,"language":26,"meta":27,"style":27},"# 假设应该提交到 feature 分支，却提交到了 main\ngit branch feature                # 在当前位置创建分支\ngit reset --hard HEAD~1           # main 回退\ngit switch feature                # 切到 feature\n",[29,1652,1653,1658,1670,1683],{"__ignoreMap":27},[32,1654,1655],{"class":34,"line":35},[32,1656,1657],{"class":38},"# 假设应该提交到 feature 分支，却提交到了 main\n",[32,1659,1660,1662,1664,1667],{"class":34,"line":42},[32,1661,46],{"class":45},[32,1663,454],{"class":49},[32,1665,1666],{"class":49}," feature",[32,1668,1669],{"class":38},"                # 在当前位置创建分支\n",[32,1671,1672,1674,1676,1678,1680],{"class":34,"line":63},[32,1673,46],{"class":45},[32,1675,892],{"class":49},[32,1677,972],{"class":53},[32,1679,951],{"class":49},[32,1681,1682],{"class":38},"           # main 回退\n",[32,1684,1685,1687,1689,1691],{"class":34,"line":78},[32,1686,46],{"class":45},[32,1688,506],{"class":49},[32,1690,1666],{"class":49},[32,1692,1693],{"class":38},"                # 切到 feature\n",[369,1695,1697],{"id":1696},"_3-本地分支落后想同步远程","3. 本地分支落后，想同步远程",[22,1699,1701],{"className":24,"code":1700,"language":26,"meta":27,"style":27},"git fetch origin\ngit rebase origin\u002Fmain\n# 或者\ngit pull --rebase origin main\n",[29,1702,1703,1712,1721,1726],{"__ignoreMap":27},[32,1704,1705,1707,1709],{"class":34,"line":35},[32,1706,46],{"class":45},[32,1708,1250],{"class":49},[32,1710,1711],{"class":49}," origin\n",[32,1713,1714,1716,1718],{"class":34,"line":42},[32,1715,46],{"class":45},[32,1717,684],{"class":49},[32,1719,1720],{"class":49}," origin\u002Fmain\n",[32,1722,1723],{"class":34,"line":63},[32,1724,1725],{"class":38},"# 或者\n",[32,1727,1728,1730,1732,1734,1736],{"class":34,"line":78},[32,1729,46],{"class":45},[32,1731,364],{"class":49},[32,1733,1271],{"class":53},[32,1735,1190],{"class":49},[32,1737,155],{"class":49},[369,1739,1741],{"id":1740},"_4-合并冲突","4. 合并冲突",[22,1743,1745],{"className":24,"code":1744,"language":26,"meta":27,"style":27},"git status                        # 查看冲突文件\n# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\ngit add \u003Cresolved-file>\ngit commit                        # 或 git rebase --continue\n",[29,1746,1747,1756,1761,1776],{"__ignoreMap":27},[32,1748,1749,1751,1753],{"class":34,"line":35},[32,1750,46],{"class":45},[32,1752,266],{"class":49},[32,1754,1755],{"class":38},"                        # 查看冲突文件\n",[32,1757,1758],{"class":34,"line":42},[32,1759,1760],{"class":38},"# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\n",[32,1762,1763,1765,1767,1769,1772,1774],{"class":34,"line":63},[32,1764,46],{"class":45},[32,1766,276],{"class":49},[32,1768,280],{"class":279},[32,1770,1771],{"class":49},"resolved-fil",[32,1773,287],{"class":286},[32,1775,1000],{"class":279},[32,1777,1778,1780,1782],{"class":34,"line":78},[32,1779,46],{"class":45},[32,1781,324],{"class":49},[32,1783,1784],{"class":38},"                        # 或 git rebase --continue\n",[13,1786,1787],{},"放弃合并：",[22,1789,1791],{"className":24,"code":1790,"language":26,"meta":27,"style":27},"git merge --abort\ngit rebase --abort\n",[29,1792,1793,1802],{"__ignoreMap":27},[32,1794,1795,1797,1799],{"class":34,"line":35},[32,1796,46],{"class":45},[32,1798,644],{"class":49},[32,1800,1801],{"class":53}," --abort\n",[32,1803,1804,1806,1808],{"class":34,"line":42},[32,1805,46],{"class":45},[32,1807,684],{"class":49},[32,1809,1801],{"class":53},[369,1811,1813],{"id":1812},"_5-不小心提交了敏感信息","5. 不小心提交了敏感信息",[13,1815,1816,1817,1820,1821,1824],{},"如果还没推送，",[29,1818,1819],{},"git reset --hard"," 即可。",[1822,1823],"br",{},"\n如果已推送，必须改写历史：",[22,1826,1828],{"className":24,"code":1827,"language":26,"meta":27,"style":27},"git filter-repo --path secrets.txt --invert-paths\ngit push --force-with-lease\n",[29,1829,1830,1846],{"__ignoreMap":27},[32,1831,1832,1834,1837,1840,1843],{"class":34,"line":35},[32,1833,46],{"class":45},[32,1835,1836],{"class":49}," filter-repo",[32,1838,1839],{"class":53}," --path",[32,1841,1842],{"class":49}," secrets.txt",[32,1844,1845],{"class":53}," --invert-paths\n",[32,1847,1848,1850,1852],{"class":34,"line":42},[32,1849,46],{"class":45},[32,1851,354],{"class":49},[32,1853,1854],{"class":53}," --force-with-lease\n",[13,1856,1857],{},"同时立即更换泄露的密钥，因为 Git 服务器可能仍留有副本。",[369,1859,1861],{"id":1860},"_6-忽略文件不生效","6. 忽略文件不生效",[22,1863,1865],{"className":24,"code":1864,"language":26,"meta":27,"style":27},"git rm -r --cached .\ngit add .\ngit commit -m \"fix gitignore\"\n",[29,1866,1867,1883,1891],{"__ignoreMap":27},[32,1868,1869,1871,1874,1877,1880],{"class":34,"line":35},[32,1870,46],{"class":45},[32,1872,1873],{"class":49}," rm",[32,1875,1876],{"class":53}," -r",[32,1878,1879],{"class":53}," --cached",[32,1881,1882],{"class":49}," .\n",[32,1884,1885,1887,1889],{"class":34,"line":42},[32,1886,46],{"class":45},[32,1888,276],{"class":49},[32,1890,1882],{"class":49},[32,1892,1893,1895,1897,1899],{"class":34,"line":63},[32,1894,46],{"class":45},[32,1896,324],{"class":49},[32,1898,327],{"class":53},[32,1900,1901],{"class":49}," \"fix gitignore\"\n",[13,1903,1904,1907,1908,1911],{},[29,1905,1906],{},".gitignore"," 只对未跟踪文件生效，已跟踪的文件需要先 ",[29,1909,1910],{},"rm --cached","。",[17,1913,1915],{"id":1914},"十提交规范conventional-commits","十、提交规范（Conventional Commits）",[22,1917,1922],{"className":1918,"code":1920,"language":1921},[1919],"language-text","\u003Ctype>(\u003Cscope>): \u003Csubject>\n\n\u003Cbody>\n\n\u003Cfooter>\n","text",[29,1923,1920],{"__ignoreMap":27},[13,1925,1926],{},"常用 type：",[729,1928,1929,1939],{},[732,1930,1931],{},[735,1932,1933,1936],{},[738,1934,1935],{},"type",[738,1937,1938],{},"说明",[751,1940,1941,1951,1961,1971,1981,1991,2001,2011],{},[735,1942,1943,1948],{},[756,1944,1945],{},[29,1946,1947],{},"feat",[756,1949,1950],{},"新功能",[735,1952,1953,1958],{},[756,1954,1955],{},[29,1956,1957],{},"fix",[756,1959,1960],{},"修复 bug",[735,1962,1963,1968],{},[756,1964,1965],{},[29,1966,1967],{},"docs",[756,1969,1970],{},"文档变更",[735,1972,1973,1978],{},[756,1974,1975],{},[29,1976,1977],{},"style",[756,1979,1980],{},"格式调整（不影响代码逻辑）",[735,1982,1983,1988],{},[756,1984,1985],{},[29,1986,1987],{},"refactor",[756,1989,1990],{},"重构",[735,1992,1993,1998],{},[756,1994,1995],{},[29,1996,1997],{},"perf",[756,1999,2000],{},"性能优化",[735,2002,2003,2008],{},[756,2004,2005],{},[29,2006,2007],{},"test",[756,2009,2010],{},"测试相关",[735,2012,2013,2018],{},[756,2014,2015],{},[29,2016,2017],{},"chore",[756,2019,2020],{},"构建 \u002F 工具 \u002F 依赖变更",[13,2022,2023],{},"示例：",[22,2025,2028],{"className":2026,"code":2027,"language":1921},[1919],"feat(auth): 支持 OAuth 2.0 登录\n\n- 新增 GitHub \u002F Google 登录入口\n- 补充 token 刷新逻辑\n\nCloses #123\n",[29,2029,2027],{"__ignoreMap":27},[17,2031,2033],{"id":2032},"十一实用技巧","十一、实用技巧",[22,2035,2037],{"className":24,"code":2036,"language":26,"meta":27,"style":27},"# 快速查看某文件的最后一次修改\ngit log -1 --stat \u003Cfile>\n\n# 查找是哪次提交引入了某个字符串\ngit log -S \"search-string\" --source --all\n\n# 查看两个分支的共同祖先\ngit merge-base main feature\n\n# 比较工作区和某个提交\ngit diff \u003Ccommit>\n\n# 临时切换到某个提交查看，不切分支\ngit switch --detach \u003Ccommit>\n\n# 查看暂存区的具体内容\ngit diff --staged\n\n# 统计每个作者的提交数\ngit shortlog -sn\n\n# 找出未被合并的分支\ngit branch --no-merged\n",[29,2038,2039,2044,2064,2068,2073,2090,2094,2099,2112,2116,2121,2135,2139,2144,2161,2165,2170,2179,2183,2188,2198,2202,2208],{"__ignoreMap":27},[32,2040,2041],{"class":34,"line":35},[32,2042,2043],{"class":38},"# 快速查看某文件的最后一次修改\n",[32,2045,2046,2048,2050,2053,2056,2058,2060,2062],{"class":34,"line":42},[32,2047,46],{"class":45},[32,2049,1456],{"class":49},[32,2051,2052],{"class":53}," -1",[32,2054,2055],{"class":53}," --stat",[32,2057,280],{"class":279},[32,2059,283],{"class":49},[32,2061,287],{"class":286},[32,2063,1000],{"class":279},[32,2065,2066],{"class":34,"line":63},[32,2067,82],{"emptyLinePlaceholder":81},[32,2069,2070],{"class":34,"line":78},[32,2071,2072],{"class":38},"# 查找是哪次提交引入了某个字符串\n",[32,2074,2075,2077,2079,2081,2084,2087],{"class":34,"line":85},[32,2076,46],{"class":45},[32,2078,1456],{"class":49},[32,2080,1544],{"class":53},[32,2082,2083],{"class":49}," \"search-string\"",[32,2085,2086],{"class":53}," --source",[32,2088,2089],{"class":53}," --all\n",[32,2091,2092],{"class":34,"line":91},[32,2093,82],{"emptyLinePlaceholder":81},[32,2095,2096],{"class":34,"line":106},[32,2097,2098],{"class":38},"# 查看两个分支的共同祖先\n",[32,2100,2101,2103,2106,2109],{"class":34,"line":111},[32,2102,46],{"class":45},[32,2104,2105],{"class":49}," merge-base",[32,2107,2108],{"class":49}," main",[32,2110,2111],{"class":49}," feature\n",[32,2113,2114],{"class":34,"line":117},[32,2115,82],{"emptyLinePlaceholder":81},[32,2117,2118],{"class":34,"line":132},[32,2119,2120],{"class":38},"# 比较工作区和某个提交\n",[32,2122,2123,2125,2127,2129,2131,2133],{"class":34,"line":137},[32,2124,46],{"class":45},[32,2126,383],{"class":49},[32,2128,280],{"class":279},[32,2130,1580],{"class":49},[32,2132,1583],{"class":286},[32,2134,1000],{"class":279},[32,2136,2137],{"class":34,"line":143},[32,2138,82],{"emptyLinePlaceholder":81},[32,2140,2141],{"class":34,"line":158},[32,2142,2143],{"class":38},"# 临时切换到某个提交查看，不切分支\n",[32,2145,2146,2148,2150,2153,2155,2157,2159],{"class":34,"line":163},[32,2147,46],{"class":45},[32,2149,506],{"class":49},[32,2151,2152],{"class":53}," --detach",[32,2154,280],{"class":279},[32,2156,1580],{"class":49},[32,2158,1583],{"class":286},[32,2160,1000],{"class":279},[32,2162,2163],{"class":34,"line":169},[32,2164,82],{"emptyLinePlaceholder":81},[32,2166,2167],{"class":34,"line":184},[32,2168,2169],{"class":38},"# 查看暂存区的具体内容\n",[32,2171,2172,2174,2176],{"class":34,"line":199},[32,2173,46],{"class":45},[32,2175,383],{"class":49},[32,2177,2178],{"class":53}," --staged\n",[32,2180,2181],{"class":34,"line":214},[32,2182,82],{"emptyLinePlaceholder":81},[32,2184,2185],{"class":34,"line":229},[32,2186,2187],{"class":38},"# 统计每个作者的提交数\n",[32,2189,2190,2192,2195],{"class":34,"line":234},[32,2191,46],{"class":45},[32,2193,2194],{"class":49}," shortlog",[32,2196,2197],{"class":53}," -sn\n",[32,2199,2200],{"class":34,"line":240},[32,2201,82],{"emptyLinePlaceholder":81},[32,2203,2205],{"class":34,"line":2204},22,[32,2206,2207],{"class":38},"# 找出未被合并的分支\n",[32,2209,2211,2213,2215],{"class":34,"line":2210},23,[32,2212,46],{"class":45},[32,2214,454],{"class":49},[32,2216,2217],{"class":53}," --no-merged\n",[17,2219,2221],{"id":2220},"十二配置文件位置","十二、配置文件位置",[729,2223,2224,2234],{},[732,2225,2226],{},[735,2227,2228,2231],{},[738,2229,2230],{},"级别",[738,2232,2233],{},"路径",[751,2235,2236,2251,2265],{},[735,2237,2238,2241],{},[756,2239,2240],{},"系统",[756,2242,2243,2246,2247,2250],{},[29,2244,2245],{},"\u002Fetc\u002Fgitconfig","（Linux）\u002F ",[29,2248,2249],{},"C:\\Program Files\\Git\\etc\\gitconfig","（Windows）",[735,2252,2253,2256],{},[756,2254,2255],{},"全局",[756,2257,2258,2261,2262],{},[29,2259,2260],{},"~\u002F.gitconfig"," \u002F ",[29,2263,2264],{},"%USERPROFILE%\\.gitconfig",[735,2266,2267,2270],{},[756,2268,2269],{},"仓库",[756,2271,2272],{},[29,2273,2274],{},"\u003Crepo>\u002F.git\u002Fconfig",[13,2276,2277],{},"优先级：仓库 > 全局 > 系统。",[2279,2280],"hr",{},[17,2282,2283],{"id":2283},"参考",[2285,2286,2287,2300,2307],"ul",{},[2288,2289,2290,2291],"li",{},"官方文档：",[2292,2293,2294],"a",{"href":2294,"rel":2295,"target":2299},"https:\u002F\u002Fgit-scm.com\u002Fdocs",[2296,2297,2298],"nofollow","noopener","noreferrer","_blank",[2288,2301,2302,2303],{},"Pro Git（中文版）：",[2292,2304,2305],{"href":2305,"rel":2306,"target":2299},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fzh\u002Fv2",[2296,2297,2298],[2288,2308,2309,2310],{},"Conventional Commits：",[2292,2311,2312],{"href":2312,"rel":2313,"target":2299},"https:\u002F\u002Fwww.conventionalcommits.org\u002Fzh-hans\u002F",[2296,2297,2298],[1977,2315,2316],{},"html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}",{"title":27,"searchDepth":42,"depth":42,"links":2318},[2319,2320,2323,2326,2332,2333,2334,2335,2336,2344,2345,2346,2347],{"id":19,"depth":42,"text":20},{"id":253,"depth":42,"text":254,"children":2321},[2322],{"id":371,"depth":63,"text":371},{"id":441,"depth":42,"text":442,"children":2324},[2325],{"id":632,"depth":63,"text":632},{"id":723,"depth":42,"text":724,"children":2327},[2328,2329,2330,2331],{"id":804,"depth":63,"text":804},{"id":861,"depth":63,"text":861},{"id":908,"depth":63,"text":908},{"id":1003,"depth":63,"text":1003},{"id":1051,"depth":42,"text":1052},{"id":1160,"depth":42,"text":1161},{"id":1342,"depth":42,"text":1343},{"id":1443,"depth":42,"text":1444},{"id":1591,"depth":42,"text":1592,"children":2337},[2338,2339,2340,2341,2342,2343],{"id":1595,"depth":63,"text":1596},{"id":1646,"depth":63,"text":1647},{"id":1696,"depth":63,"text":1697},{"id":1740,"depth":63,"text":1741},{"id":1812,"depth":63,"text":1813},{"id":1860,"depth":63,"text":1861},{"id":1914,"depth":42,"text":1915},{"id":2032,"depth":42,"text":2033},{"id":2220,"depth":42,"text":2221},{"id":2283,"depth":42,"text":2283},"2026-09-25","md",{},"\u002Fgit-memo-2026-09-25",{"title":7,"description":15},"git-memo-2026-09-25",[2355,2356],"Git","备忘录","0H9pi2QAc8Lw_Eh4bdHwdkFMYOEf4495Ze_IMkWMpDk",{"id":2359,"title":2360,"author":8,"body":2361,"cover":3,"date":2348,"description":2365,"extension":2349,"meta":7993,"navigation":81,"path":7994,"seo":7995,"stem":7996,"tags":7997,"__hash__":8000},"content\u002Flinux-memo-2026-09-25.md","Linux 备忘录",{"type":10,"value":2362,"toc":7945},[2363,2366,2370,2374,2377,2434,2444,2467,2477,2481,2545,2549,2651,2657,2735,2740,2785,2789,2796,2802,2805,2862,2866,2960,2963,3021,3025,3030,3089,3137,3142,3146,3176,3180,3185,3227,3231,3311,3315,3507,3510,3662,3666,4047,4050,4117,4121,4228,4231,4277,4294,4297,4356,4360,4559,4562,4622,4626,4951,4954,5091,5095,5225,5228,5276,5280,5464,5468,5663,5666,5675,5681,5685,5848,5854,5929,5957,5961,6069,6074,6080,6086,6089,6207,6211,6215,6409,6413,6615,6619,6703,6707,6828,6832,6979,6983,7052,7055,7092,7095,7234,7238,7271,7274,7280,7282,7288,7291,7305,7309,7513,7516,7587,7590,7781,7785,7895,7897,7899,7942],[13,2364,2365],{},"国内环境下的高频命令。换源和镜像放在最前面。",[17,2367,2369],{"id":2368},"一换源","一、换源",[369,2371,2373],{"id":2372},"_11-aptdebian-ubuntu","1.1 apt（Debian \u002F Ubuntu）",[13,2375,2376],{},"先备份，再替换：",[22,2378,2380],{"className":24,"code":2379,"language":26,"meta":27,"style":27},"sudo cp \u002Fetc\u002Fapt\u002Fsources.list \u002Fetc\u002Fapt\u002Fsources.list.bak\nsudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo sed -i 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo apt update\n",[29,2381,2382,2396,2411,2424],{"__ignoreMap":27},[32,2383,2384,2387,2390,2393],{"class":34,"line":35},[32,2385,2386],{"class":45},"sudo",[32,2388,2389],{"class":49}," cp",[32,2391,2392],{"class":49}," \u002Fetc\u002Fapt\u002Fsources.list",[32,2394,2395],{"class":49}," \u002Fetc\u002Fapt\u002Fsources.list.bak\n",[32,2397,2398,2400,2403,2405,2408],{"class":34,"line":42},[32,2399,2386],{"class":45},[32,2401,2402],{"class":49}," sed",[32,2404,704],{"class":53},[32,2406,2407],{"class":49}," 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[32,2409,2410],{"class":49}," \u002Fetc\u002Fapt\u002Fsources.list\n",[32,2412,2413,2415,2417,2419,2422],{"class":34,"line":63},[32,2414,2386],{"class":45},[32,2416,2402],{"class":49},[32,2418,704],{"class":53},[32,2420,2421],{"class":49}," 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[32,2423,2410],{"class":49},[32,2425,2426,2428,2431],{"class":34,"line":78},[32,2427,2386],{"class":45},[32,2429,2430],{"class":49}," apt",[32,2432,2433],{"class":49}," update\n",[13,2435,2436,2439,2440,2443],{},[717,2437,2438],{},"Ubuntu 24.04+"," 使用新格式 ",[29,2441,2442],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources","：",[22,2445,2447],{"className":24,"code":2446,"language":26,"meta":27,"style":27},"sudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \\\n  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[29,2448,2449,2462],{"__ignoreMap":27},[32,2450,2451,2453,2455,2457,2459],{"class":34,"line":35},[32,2452,2386],{"class":45},[32,2454,2402],{"class":49},[32,2456,704],{"class":53},[32,2458,2407],{"class":49},[32,2460,2461],{"class":53}," \\\n",[32,2463,2464],{"class":34,"line":42},[32,2465,2466],{"class":49},"  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[13,2468,2469,2472,2473,2476],{},[717,2470,2471],{},"Debian 12+"," 使用 ",[29,2474,2475],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdebian.sources","，同理。",[369,2478,2480],{"id":2479},"_12-常用-apt-镜像源","1.2 常用 apt 镜像源",[729,2482,2483,2493],{},[732,2484,2485],{},[735,2486,2487,2490],{},[738,2488,2489],{},"源",[738,2491,2492],{},"URL",[751,2494,2495,2505,2515,2525,2535],{},[735,2496,2497,2500],{},[756,2498,2499],{},"清华",[756,2501,2502],{},[29,2503,2504],{},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn",[735,2506,2507,2510],{},[756,2508,2509],{},"阿里云",[756,2511,2512],{},[29,2513,2514],{},"https:\u002F\u002Fmirrors.aliyun.com",[735,2516,2517,2520],{},[756,2518,2519],{},"中科大",[756,2521,2522],{},[29,2523,2524],{},"https:\u002F\u002Fmirrors.ustc.edu.cn",[735,2526,2527,2530],{},[756,2528,2529],{},"华为云",[756,2531,2532],{},[29,2533,2534],{},"https:\u002F\u002Fmirrors.huaweicloud.com",[735,2536,2537,2540],{},[756,2538,2539],{},"网易",[756,2541,2542],{},[29,2543,2544],{},"https:\u002F\u002Fmirrors.163.com",[369,2546,2548],{"id":2547},"_13-yum-dnfrhel-centos-fedora","1.3 yum \u002F dnf（RHEL \u002F CentOS \u002F Fedora）",[22,2550,2552],{"className":24,"code":2551,"language":26,"meta":27,"style":27},"# 备份\nsudo cp -r \u002Fetc\u002Fyum.repos.d \u002Fetc\u002Fyum.repos.d.bak\n\n# CentOS 7 换阿里云\nsudo sed -i 's|mirrorlist=|#mirrorlist=|g' \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\nsudo sed -i 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\n\nsudo yum clean all\nsudo yum makecache\n",[29,2553,2554,2559,2573,2577,2582,2603,2616,2625,2629,2642],{"__ignoreMap":27},[32,2555,2556],{"class":34,"line":35},[32,2557,2558],{"class":38},"# 备份\n",[32,2560,2561,2563,2565,2567,2570],{"class":34,"line":42},[32,2562,2386],{"class":45},[32,2564,2389],{"class":49},[32,2566,1876],{"class":53},[32,2568,2569],{"class":49}," \u002Fetc\u002Fyum.repos.d",[32,2571,2572],{"class":49}," \u002Fetc\u002Fyum.repos.d.bak\n",[32,2574,2575],{"class":34,"line":63},[32,2576,82],{"emptyLinePlaceholder":81},[32,2578,2579],{"class":34,"line":78},[32,2580,2581],{"class":38},"# CentOS 7 换阿里云\n",[32,2583,2584,2586,2588,2590,2593,2596,2600],{"class":34,"line":85},[32,2585,2386],{"class":45},[32,2587,2402],{"class":49},[32,2589,704],{"class":53},[32,2591,2592],{"class":49}," 's|mirrorlist=|#mirrorlist=|g'",[32,2594,2595],{"class":49}," \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[32,2597,2599],{"class":2598},"szGx7","*",[32,2601,2602],{"class":49},".repo\n",[32,2604,2605,2607,2609,2611,2614],{"class":34,"line":91},[32,2606,2386],{"class":45},[32,2608,2402],{"class":49},[32,2610,704],{"class":53},[32,2612,2613],{"class":49}," 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g'",[32,2615,2461],{"class":53},[32,2617,2618,2621,2623],{"class":34,"line":106},[32,2619,2620],{"class":49},"  \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[32,2622,2599],{"class":2598},[32,2624,2602],{"class":49},[32,2626,2627],{"class":34,"line":111},[32,2628,82],{"emptyLinePlaceholder":81},[32,2630,2631,2633,2636,2639],{"class":34,"line":117},[32,2632,2386],{"class":45},[32,2634,2635],{"class":49}," yum",[32,2637,2638],{"class":49}," clean",[32,2640,2641],{"class":49}," all\n",[32,2643,2644,2646,2648],{"class":34,"line":132},[32,2645,2386],{"class":45},[32,2647,2635],{"class":49},[32,2649,2650],{"class":49}," makecache\n",[13,2652,2653,2656],{},[717,2654,2655],{},"CentOS 8 \u002F Stream"," 需要先换 vault（官方源已下线）：",[22,2658,2660],{"className":24,"code":2659,"language":26,"meta":27,"style":27},"sudo sed -i 's|mirror.centos.org|mirrors.aliyun.com|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^#baseurl|baseurl|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^mirrorlist|#mirrorlist|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo dnf clean all && sudo dnf makecache\n",[29,2661,2662,2680,2697,2714],{"__ignoreMap":27},[32,2663,2664,2666,2668,2670,2673,2676,2678],{"class":34,"line":35},[32,2665,2386],{"class":45},[32,2667,2402],{"class":49},[32,2669,704],{"class":53},[32,2671,2672],{"class":49}," 's|mirror.centos.org|mirrors.aliyun.com|g'",[32,2674,2675],{"class":49}," \u002Fetc\u002Fyum.repos.d\u002F",[32,2677,2599],{"class":2598},[32,2679,2602],{"class":49},[32,2681,2682,2684,2686,2688,2691,2693,2695],{"class":34,"line":42},[32,2683,2386],{"class":45},[32,2685,2402],{"class":49},[32,2687,704],{"class":53},[32,2689,2690],{"class":49}," 's|^#baseurl|baseurl|g'",[32,2692,2675],{"class":49},[32,2694,2599],{"class":2598},[32,2696,2602],{"class":49},[32,2698,2699,2701,2703,2705,2708,2710,2712],{"class":34,"line":63},[32,2700,2386],{"class":45},[32,2702,2402],{"class":49},[32,2704,704],{"class":53},[32,2706,2707],{"class":49}," 's|^mirrorlist|#mirrorlist|g'",[32,2709,2675],{"class":49},[32,2711,2599],{"class":2598},[32,2713,2602],{"class":49},[32,2715,2716,2718,2721,2723,2726,2729,2731,2733],{"class":34,"line":78},[32,2717,2386],{"class":45},[32,2719,2720],{"class":49}," dnf",[32,2722,2638],{"class":49},[32,2724,2725],{"class":49}," all",[32,2727,2728],{"class":286}," && ",[32,2730,2386],{"class":45},[32,2732,2720],{"class":49},[32,2734,2650],{"class":49},[13,2736,2737,2443],{},[717,2738,2739],{},"Fedora",[22,2741,2743],{"className":24,"code":2742,"language":26,"meta":27,"style":27},"sudo sed -i 's|^metalink=|#metalink=|g' \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\nsudo sed -i 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\n",[29,2744,2745,2763,2776],{"__ignoreMap":27},[32,2746,2747,2749,2751,2753,2756,2759,2761],{"class":34,"line":35},[32,2748,2386],{"class":45},[32,2750,2402],{"class":49},[32,2752,704],{"class":53},[32,2754,2755],{"class":49}," 's|^metalink=|#metalink=|g'",[32,2757,2758],{"class":49}," \u002Fetc\u002Fyum.repos.d\u002Ffedora",[32,2760,2599],{"class":2598},[32,2762,2602],{"class":49},[32,2764,2765,2767,2769,2771,2774],{"class":34,"line":42},[32,2766,2386],{"class":45},[32,2768,2402],{"class":49},[32,2770,704],{"class":53},[32,2772,2773],{"class":49}," 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g'",[32,2775,2461],{"class":53},[32,2777,2778,2781,2783],{"class":34,"line":63},[32,2779,2780],{"class":49},"  \u002Fetc\u002Fyum.repos.d\u002Ffedora",[32,2782,2599],{"class":2598},[32,2784,2602],{"class":49},[369,2786,2788],{"id":2787},"_14-pacmanarch","1.4 pacman（Arch）",[13,2790,2791,2792,2795],{},"编辑 ",[29,2793,2794],{},"\u002Fetc\u002Fpacman.d\u002Fmirrorlist","，把国内源放前面：",[22,2797,2800],{"className":2798,"code":2799,"language":1921},[1919],"Server = https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\nServer = https:\u002F\u002Fmirrors.ustc.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\n",[29,2801,2799],{"__ignoreMap":27},[13,2803,2804],{},"或者一键：",[22,2806,2808],{"className":24,"code":2807,"language":26,"meta":27,"style":27},"sudo pacman -S reflector\nsudo reflector --country China --latest 5 --sort rate --save \u002Fetc\u002Fpacman.d\u002Fmirrorlist\nsudo pacman -Syyu\n",[29,2809,2810,2822,2853],{"__ignoreMap":27},[32,2811,2812,2814,2817,2819],{"class":34,"line":35},[32,2813,2386],{"class":45},[32,2815,2816],{"class":49}," pacman",[32,2818,1544],{"class":53},[32,2820,2821],{"class":49}," reflector\n",[32,2823,2824,2826,2829,2832,2835,2838,2841,2844,2847,2850],{"class":34,"line":42},[32,2825,2386],{"class":45},[32,2827,2828],{"class":49}," reflector",[32,2830,2831],{"class":53}," --country",[32,2833,2834],{"class":49}," China",[32,2836,2837],{"class":53}," --latest",[32,2839,2840],{"class":53}," 5",[32,2842,2843],{"class":53}," --sort",[32,2845,2846],{"class":49}," rate",[32,2848,2849],{"class":53}," --save",[32,2851,2852],{"class":49}," \u002Fetc\u002Fpacman.d\u002Fmirrorlist\n",[32,2854,2855,2857,2859],{"class":34,"line":63},[32,2856,2386],{"class":45},[32,2858,2816],{"class":49},[32,2860,2861],{"class":53}," -Syyu\n",[369,2863,2865],{"id":2864},"_15-pip-换源","1.5 pip 换源",[22,2867,2869],{"className":24,"code":2868,"language":26,"meta":27,"style":27},"# 永久\npip config set global.index-url https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\npip config set global.trusted-host pypi.tuna.tsinghua.edu.cn\n\n# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n# [global]\n# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n# trusted-host = pypi.tuna.tsinghua.edu.cn\n\n# 一次性\npip install \u003Cpkg> -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[29,2870,2871,2876,2892,2906,2910,2915,2920,2925,2930,2934,2939],{"__ignoreMap":27},[32,2872,2873],{"class":34,"line":35},[32,2874,2875],{"class":38},"# 永久\n",[32,2877,2878,2881,2883,2886,2889],{"class":34,"line":42},[32,2879,2880],{"class":45},"pip",[32,2882,50],{"class":49},[32,2884,2885],{"class":49}," set",[32,2887,2888],{"class":49}," global.index-url",[32,2890,2891],{"class":49}," https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[32,2893,2894,2896,2898,2900,2903],{"class":34,"line":63},[32,2895,2880],{"class":45},[32,2897,50],{"class":49},[32,2899,2885],{"class":49},[32,2901,2902],{"class":49}," global.trusted-host",[32,2904,2905],{"class":49}," pypi.tuna.tsinghua.edu.cn\n",[32,2907,2908],{"class":34,"line":78},[32,2909,82],{"emptyLinePlaceholder":81},[32,2911,2912],{"class":34,"line":85},[32,2913,2914],{"class":38},"# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n",[32,2916,2917],{"class":34,"line":91},[32,2918,2919],{"class":38},"# [global]\n",[32,2921,2922],{"class":34,"line":106},[32,2923,2924],{"class":38},"# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[32,2926,2927],{"class":34,"line":111},[32,2928,2929],{"class":38},"# trusted-host = pypi.tuna.tsinghua.edu.cn\n",[32,2931,2932],{"class":34,"line":117},[32,2933,82],{"emptyLinePlaceholder":81},[32,2935,2936],{"class":34,"line":132},[32,2937,2938],{"class":38},"# 一次性\n",[32,2940,2941,2943,2946,2948,2951,2954,2956,2958],{"class":34,"line":137},[32,2942,2880],{"class":45},[32,2944,2945],{"class":49}," install",[32,2947,280],{"class":279},[32,2949,2950],{"class":49},"pk",[32,2952,2953],{"class":286},"g",[32,2955,290],{"class":279},[32,2957,704],{"class":53},[32,2959,2891],{"class":49},[13,2961,2962],{},"常用 pip 镜像：",[729,2964,2965,2973],{},[732,2966,2967],{},[735,2968,2969,2971],{},[738,2970,2489],{},[738,2972,2492],{},[751,2974,2975,2984,2993,3002,3012],{},[735,2976,2977,2979],{},[756,2978,2499],{},[756,2980,2981],{},[29,2982,2983],{},"https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple",[735,2985,2986,2988],{},[756,2987,2509],{},[756,2989,2990],{},[29,2991,2992],{},"https:\u002F\u002Fmirrors.aliyun.com\u002Fpypi\u002Fsimple\u002F",[735,2994,2995,2997],{},[756,2996,2519],{},[756,2998,2999],{},[29,3000,3001],{},"https:\u002F\u002Fpypi.mirrors.ustc.edu.cn\u002Fsimple\u002F",[735,3003,3004,3007],{},[756,3005,3006],{},"豆瓣",[756,3008,3009],{},[29,3010,3011],{},"https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F",[735,3013,3014,3016],{},[756,3015,2529],{},[756,3017,3018],{},[29,3019,3020],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fpypi\u002Fsimple\u002F",[369,3022,3024],{"id":3023},"_16-docker-镜像加速","1.6 Docker 镜像加速",[13,3026,2791,3027,2443],{},[29,3028,3029],{},"\u002Fetc\u002Fdocker\u002Fdaemon.json",[22,3031,3035],{"className":3032,"code":3033,"language":3034,"meta":27,"style":27},"language-json shiki shiki-themes monokai","{\n  \"registry-mirrors\": [\n    \"https:\u002F\u002Fdocker.m.daocloud.io\",\n    \"https:\u002F\u002Fdockerproxy.com\",\n    \"https:\u002F\u002Fmirror.baidubce.com\",\n    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n  ]\n}\n","json",[29,3036,3037,3042,3051,3060,3067,3074,3079,3084],{"__ignoreMap":27},[32,3038,3039],{"class":34,"line":35},[32,3040,3041],{"class":286},"{\n",[32,3043,3044,3048],{"class":34,"line":42},[32,3045,3047],{"class":3046},"sOx1s","  \"registry-mirrors\"",[32,3049,3050],{"class":286},": [\n",[32,3052,3053,3057],{"class":34,"line":63},[32,3054,3056],{"class":3055},"susgL","    \"https:\u002F\u002Fdocker.m.daocloud.io\"",[32,3058,3059],{"class":286},",\n",[32,3061,3062,3065],{"class":34,"line":78},[32,3063,3064],{"class":3055},"    \"https:\u002F\u002Fdockerproxy.com\"",[32,3066,3059],{"class":286},[32,3068,3069,3072],{"class":34,"line":85},[32,3070,3071],{"class":3055},"    \"https:\u002F\u002Fmirror.baidubce.com\"",[32,3073,3059],{"class":286},[32,3075,3076],{"class":34,"line":91},[32,3077,3078],{"class":3055},"    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n",[32,3080,3081],{"class":34,"line":106},[32,3082,3083],{"class":286},"  ]\n",[32,3085,3086],{"class":34,"line":111},[32,3087,3088],{"class":286},"}\n",[22,3090,3092],{"className":24,"code":3091,"language":26,"meta":27,"style":27},"sudo systemctl daemon-reload\nsudo systemctl restart docker\ndocker info | grep -A 5 \"Registry Mirrors\"\n",[29,3093,3094,3104,3116],{"__ignoreMap":27},[32,3095,3096,3098,3101],{"class":34,"line":35},[32,3097,2386],{"class":45},[32,3099,3100],{"class":49}," systemctl",[32,3102,3103],{"class":49}," daemon-reload\n",[32,3105,3106,3108,3110,3113],{"class":34,"line":42},[32,3107,2386],{"class":45},[32,3109,3100],{"class":49},[32,3111,3112],{"class":49}," restart",[32,3114,3115],{"class":49}," docker\n",[32,3117,3118,3121,3124,3127,3130,3132,3134],{"class":34,"line":63},[32,3119,3120],{"class":45},"docker",[32,3122,3123],{"class":49}," info",[32,3125,3126],{"class":279}," |",[32,3128,3129],{"class":45}," grep",[32,3131,314],{"class":53},[32,3133,2840],{"class":53},[32,3135,3136],{"class":49}," \"Registry Mirrors\"\n",[712,3138,3139],{},[13,3140,3141],{},"2024 年后很多公共镜像源已停服，以上仅供参考。企业环境建议自建 Harbor 或使用阿里云\u002F腾讯云容器镜像服务。",[369,3143,3145],{"id":3144},"_17-go-module-代理","1.7 Go module 代理",[22,3147,3149],{"className":24,"code":3148,"language":26,"meta":27,"style":27},"go env -w GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\ngo env -w GOSUMDB=sum.golang.google.cn\n",[29,3150,3151,3165],{"__ignoreMap":27},[32,3152,3153,3156,3159,3162],{"class":34,"line":35},[32,3154,3155],{"class":45},"go",[32,3157,3158],{"class":49}," env",[32,3160,3161],{"class":53}," -w",[32,3163,3164],{"class":49}," GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n",[32,3166,3167,3169,3171,3173],{"class":34,"line":42},[32,3168,3155],{"class":45},[32,3170,3158],{"class":49},[32,3172,3161],{"class":53},[32,3174,3175],{"class":49}," GOSUMDB=sum.golang.google.cn\n",[369,3177,3179],{"id":3178},"_18-maven-换源","1.8 Maven 换源",[13,3181,2791,3182,2443],{},[29,3183,3184],{},"~\u002F.m2\u002Fsettings.xml",[22,3186,3190],{"className":3187,"code":3188,"language":3189,"meta":27,"style":27},"language-xml shiki shiki-themes monokai","\u003Cmirrors>\n  \u003Cmirror>\n    \u003Cid>aliyun\u003C\u002Fid>\n    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n  \u003C\u002Fmirror>\n\u003C\u002Fmirrors>\n","xml",[29,3191,3192,3197,3202,3207,3212,3217,3222],{"__ignoreMap":27},[32,3193,3194],{"class":34,"line":35},[32,3195,3196],{},"\u003Cmirrors>\n",[32,3198,3199],{"class":34,"line":42},[32,3200,3201],{},"  \u003Cmirror>\n",[32,3203,3204],{"class":34,"line":63},[32,3205,3206],{},"    \u003Cid>aliyun\u003C\u002Fid>\n",[32,3208,3209],{"class":34,"line":78},[32,3210,3211],{},"    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n",[32,3213,3214],{"class":34,"line":85},[32,3215,3216],{},"    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n",[32,3218,3219],{"class":34,"line":91},[32,3220,3221],{},"  \u003C\u002Fmirror>\n",[32,3223,3224],{"class":34,"line":106},[32,3225,3226],{},"\u003C\u002Fmirrors>\n",[369,3228,3230],{"id":3229},"_19-换源后必做","1.9 换源后必做",[22,3232,3234],{"className":24,"code":3233,"language":26,"meta":27,"style":27},"# apt\nsudo apt update\n\n# yum \u002F dnf\nsudo yum clean all && sudo yum makecache\nsudo dnf clean all && sudo dnf makecache\n\n# pacman\nsudo pacman -Syyu\n",[29,3235,3236,3241,3249,3253,3258,3276,3294,3298,3303],{"__ignoreMap":27},[32,3237,3238],{"class":34,"line":35},[32,3239,3240],{"class":38},"# apt\n",[32,3242,3243,3245,3247],{"class":34,"line":42},[32,3244,2386],{"class":45},[32,3246,2430],{"class":49},[32,3248,2433],{"class":49},[32,3250,3251],{"class":34,"line":63},[32,3252,82],{"emptyLinePlaceholder":81},[32,3254,3255],{"class":34,"line":78},[32,3256,3257],{"class":38},"# yum \u002F dnf\n",[32,3259,3260,3262,3264,3266,3268,3270,3272,3274],{"class":34,"line":85},[32,3261,2386],{"class":45},[32,3263,2635],{"class":49},[32,3265,2638],{"class":49},[32,3267,2725],{"class":49},[32,3269,2728],{"class":286},[32,3271,2386],{"class":45},[32,3273,2635],{"class":49},[32,3275,2650],{"class":49},[32,3277,3278,3280,3282,3284,3286,3288,3290,3292],{"class":34,"line":91},[32,3279,2386],{"class":45},[32,3281,2720],{"class":49},[32,3283,2638],{"class":49},[32,3285,2725],{"class":49},[32,3287,2728],{"class":286},[32,3289,2386],{"class":45},[32,3291,2720],{"class":49},[32,3293,2650],{"class":49},[32,3295,3296],{"class":34,"line":106},[32,3297,82],{"emptyLinePlaceholder":81},[32,3299,3300],{"class":34,"line":111},[32,3301,3302],{"class":38},"# pacman\n",[32,3304,3305,3307,3309],{"class":34,"line":117},[32,3306,2386],{"class":45},[32,3308,2816],{"class":49},[32,3310,2861],{"class":53},[17,3312,3314],{"id":3313},"二文件与目录","二、文件与目录",[22,3316,3318],{"className":24,"code":3317,"language":26,"meta":27,"style":27},"pwd                               # 当前目录\nls -alh                           # 详细列表\ncd -                              # 上一个目录\nmkdir -p a\u002Fb\u002Fc                    # 递归创建\nrm -rf \u003Cdir>                      # 递归删除（危险）\ncp -r \u003Csrc> \u003Cdst>                 # 递归复制\nmv \u003Csrc> \u003Cdst>                    # 移动 \u002F 重命名\nln -s \u003Ctarget> \u003Clink>             # 软链接\ntouch \u003Cfile>\nstat \u003Cfile>\nfile \u003Cfile>\n",[29,3319,3320,3329,3340,3351,3364,3385,3414,3438,3468,3481,3494],{"__ignoreMap":27},[32,3321,3322,3326],{"class":34,"line":35},[32,3323,3325],{"class":3324},"sYf5A","pwd",[32,3327,3328],{"class":38},"                               # 当前目录\n",[32,3330,3331,3334,3337],{"class":34,"line":42},[32,3332,3333],{"class":45},"ls",[32,3335,3336],{"class":53}," -alh",[32,3338,3339],{"class":38},"                           # 详细列表\n",[32,3341,3342,3345,3348],{"class":34,"line":63},[32,3343,3344],{"class":3324},"cd",[32,3346,3347],{"class":49}," -",[32,3349,3350],{"class":38},"                              # 上一个目录\n",[32,3352,3353,3356,3358,3361],{"class":34,"line":78},[32,3354,3355],{"class":45},"mkdir",[32,3357,1494],{"class":53},[32,3359,3360],{"class":49}," a\u002Fb\u002Fc",[32,3362,3363],{"class":38},"                    # 递归创建\n",[32,3365,3366,3369,3372,3374,3377,3380,3382],{"class":34,"line":85},[32,3367,3368],{"class":45},"rm",[32,3370,3371],{"class":53}," -rf",[32,3373,280],{"class":279},[32,3375,3376],{"class":49},"di",[32,3378,3379],{"class":286},"r",[32,3381,290],{"class":279},[32,3383,3384],{"class":38},"                      # 递归删除（危险）\n",[32,3386,3387,3390,3392,3394,3397,3400,3402,3404,3407,3409,3411],{"class":34,"line":91},[32,3388,3389],{"class":45},"cp",[32,3391,1876],{"class":53},[32,3393,280],{"class":279},[32,3395,3396],{"class":49},"sr",[32,3398,3399],{"class":286},"c",[32,3401,290],{"class":279},[32,3403,280],{"class":279},[32,3405,3406],{"class":49},"ds",[32,3408,1583],{"class":286},[32,3410,290],{"class":279},[32,3412,3413],{"class":38},"                 # 递归复制\n",[32,3415,3416,3419,3421,3423,3425,3427,3429,3431,3433,3435],{"class":34,"line":106},[32,3417,3418],{"class":45},"mv",[32,3420,280],{"class":279},[32,3422,3396],{"class":49},[32,3424,3399],{"class":286},[32,3426,290],{"class":279},[32,3428,280],{"class":279},[32,3430,3406],{"class":49},[32,3432,1583],{"class":286},[32,3434,290],{"class":279},[32,3436,3437],{"class":38},"                    # 移动 \u002F 重命名\n",[32,3439,3440,3443,3446,3448,3451,3453,3455,3457,3460,3463,3465],{"class":34,"line":111},[32,3441,3442],{"class":45},"ln",[32,3444,3445],{"class":53}," -s",[32,3447,280],{"class":279},[32,3449,3450],{"class":49},"targe",[32,3452,1583],{"class":286},[32,3454,290],{"class":279},[32,3456,280],{"class":279},[32,3458,3459],{"class":49},"lin",[32,3461,3462],{"class":286},"k",[32,3464,290],{"class":279},[32,3466,3467],{"class":38},"             # 软链接\n",[32,3469,3470,3473,3475,3477,3479],{"class":34,"line":117},[32,3471,3472],{"class":45},"touch",[32,3474,280],{"class":279},[32,3476,283],{"class":49},[32,3478,287],{"class":286},[32,3480,1000],{"class":279},[32,3482,3483,3486,3488,3490,3492],{"class":34,"line":132},[32,3484,3485],{"class":3324},"stat",[32,3487,280],{"class":279},[32,3489,283],{"class":49},[32,3491,287],{"class":286},[32,3493,1000],{"class":279},[32,3495,3496,3499,3501,3503,3505],{"class":34,"line":137},[32,3497,3498],{"class":45},"file",[32,3500,280],{"class":279},[32,3502,283],{"class":49},[32,3504,287],{"class":286},[32,3506,1000],{"class":279},[369,3508,3509],{"id":3509},"查找",[22,3511,3513],{"className":24,"code":3512,"language":26,"meta":27,"style":27},"find . -name \"*.log\"                          # 按名\nfind . -type f -size +100M                    # >100M\nfind . -mtime -7                              # 7 天内\nfind . -name \"*.tmp\" -delete                  # 找到删除\nfind . -type f -exec chmod 644 {} \\;          # 批量执行\n\nwhich \u003Ccmd>                       # 命令路径\nwhereis \u003Ccmd>\nlocate \u003Cfile>                     # 快速（需 updatedb）\n",[29,3514,3515,3531,3552,3567,3584,3612,3616,3633,3646],{"__ignoreMap":27},[32,3516,3517,3520,3522,3525,3528],{"class":34,"line":35},[32,3518,3519],{"class":45},"find",[32,3521,302],{"class":49},[32,3523,3524],{"class":53}," -name",[32,3526,3527],{"class":49}," \"*.log\"",[32,3529,3530],{"class":38},"                          # 按名\n",[32,3532,3533,3535,3537,3540,3543,3546,3549],{"class":34,"line":42},[32,3534,3519],{"class":45},[32,3536,302],{"class":49},[32,3538,3539],{"class":53}," -type",[32,3541,3542],{"class":49}," f",[32,3544,3545],{"class":53}," -size",[32,3547,3548],{"class":49}," +100M",[32,3550,3551],{"class":38},"                    # >100M\n",[32,3553,3554,3556,3558,3561,3564],{"class":34,"line":63},[32,3555,3519],{"class":45},[32,3557,302],{"class":49},[32,3559,3560],{"class":53}," -mtime",[32,3562,3563],{"class":53}," -7",[32,3565,3566],{"class":38},"                              # 7 天内\n",[32,3568,3569,3571,3573,3575,3578,3581],{"class":34,"line":78},[32,3570,3519],{"class":45},[32,3572,302],{"class":49},[32,3574,3524],{"class":53},[32,3576,3577],{"class":49}," \"*.tmp\"",[32,3579,3580],{"class":53}," -delete",[32,3582,3583],{"class":38},"                  # 找到删除\n",[32,3585,3586,3588,3590,3592,3594,3597,3600,3603,3606,3609],{"class":34,"line":85},[32,3587,3519],{"class":45},[32,3589,302],{"class":49},[32,3591,3539],{"class":53},[32,3593,3542],{"class":49},[32,3595,3596],{"class":53}," -exec",[32,3598,3599],{"class":49}," chmod",[32,3601,3602],{"class":53}," 644",[32,3604,3605],{"class":49}," {}",[32,3607,3608],{"class":53}," \\;",[32,3610,3611],{"class":38},"          # 批量执行\n",[32,3613,3614],{"class":34,"line":91},[32,3615,82],{"emptyLinePlaceholder":81},[32,3617,3618,3621,3623,3626,3628,3630],{"class":34,"line":106},[32,3619,3620],{"class":3324},"which",[32,3622,280],{"class":279},[32,3624,3625],{"class":49},"cm",[32,3627,614],{"class":286},[32,3629,290],{"class":279},[32,3631,3632],{"class":38},"                       # 命令路径\n",[32,3634,3635,3638,3640,3642,3644],{"class":34,"line":111},[32,3636,3637],{"class":45},"whereis",[32,3639,280],{"class":279},[32,3641,3625],{"class":49},[32,3643,614],{"class":286},[32,3645,1000],{"class":279},[32,3647,3648,3651,3653,3655,3657,3659],{"class":34,"line":117},[32,3649,3650],{"class":45},"locate",[32,3652,280],{"class":279},[32,3654,283],{"class":49},[32,3656,287],{"class":286},[32,3658,290],{"class":279},[32,3660,3661],{"class":38},"                     # 快速（需 updatedb）\n",[17,3663,3665],{"id":3664},"三文本处理","三、文本处理",[22,3667,3669],{"className":24,"code":3668,"language":26,"meta":27,"style":27},"cat \u002F less \u002F head -n 20 \u002F tail -n 20\ntail -f \u003Cfile>                    # 实时跟踪日志\ntail -F \u003Cfile>                    # rotate 后仍能跟踪\n\ngrep \"p\" \u003Cfile>                   # 基本\ngrep -r -n -i \"p\" .               # 递归+行号+忽略大小写\ngrep -v \"p\" \u003Cfile>                # 反选\ngrep -E \"a|b\" \u003Cfile>              # 扩展正则\nrg \"p\"                            # ripgrep（快，推荐）\n\nsed 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>          # 替换到 stdout\nsed -i 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>       # 原地替换\nsed -i.bak 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>   # 带备份\nsed -n '10,20p' \u003Cfile>            # 打印范围\n\nawk '{print $1}' \u003Cfile>           # 第一列\nawk -F: '{print $1}' \u002Fetc\u002Fpasswd\nawk '$3 > 100 {print $1}' \u003Cfile>\n\ncut -d: -f1 \u002Fetc\u002Fpasswd\nsort \u003Cfile>\nsort -u \u003Cfile>                    # 去重\nuniq -c                           # 统计相邻（先 sort）\nwc -l \u003Cfile>\ntr 'a-z' 'A-Z'\n",[29,3670,3671,3703,3722,3740,3744,3763,3780,3799,3820,3830,3834,3853,3872,3892,3912,3916,3935,3947,3962,3966,3979,3992,4009,4019,4036],{"__ignoreMap":27},[32,3672,3673,3676,3679,3682,3684,3687,3690,3693,3695,3698,3700],{"class":34,"line":35},[32,3674,3675],{"class":45},"cat",[32,3677,3678],{"class":49}," \u002F",[32,3680,3681],{"class":49}," less",[32,3683,3678],{"class":49},[32,3685,3686],{"class":49}," head",[32,3688,3689],{"class":53}," -n",[32,3691,3692],{"class":53}," 20",[32,3694,3678],{"class":49},[32,3696,3697],{"class":49}," tail",[32,3699,3689],{"class":53},[32,3701,3702],{"class":53}," 20\n",[32,3704,3705,3708,3711,3713,3715,3717,3719],{"class":34,"line":42},[32,3706,3707],{"class":45},"tail",[32,3709,3710],{"class":53}," -f",[32,3712,280],{"class":279},[32,3714,283],{"class":49},[32,3716,287],{"class":286},[32,3718,290],{"class":279},[32,3720,3721],{"class":38},"                    # 实时跟踪日志\n",[32,3723,3724,3726,3729,3731,3733,3735,3737],{"class":34,"line":63},[32,3725,3707],{"class":45},[32,3727,3728],{"class":53}," -F",[32,3730,280],{"class":279},[32,3732,283],{"class":49},[32,3734,287],{"class":286},[32,3736,290],{"class":279},[32,3738,3739],{"class":38},"                    # rotate 后仍能跟踪\n",[32,3741,3742],{"class":34,"line":78},[32,3743,82],{"emptyLinePlaceholder":81},[32,3745,3746,3749,3752,3754,3756,3758,3760],{"class":34,"line":85},[32,3747,3748],{"class":45},"grep",[32,3750,3751],{"class":49}," \"p\"",[32,3753,280],{"class":279},[32,3755,283],{"class":49},[32,3757,287],{"class":286},[32,3759,290],{"class":279},[32,3761,3762],{"class":38},"                   # 基本\n",[32,3764,3765,3767,3769,3771,3773,3775,3777],{"class":34,"line":91},[32,3766,3748],{"class":45},[32,3768,1876],{"class":53},[32,3770,3689],{"class":53},[32,3772,704],{"class":53},[32,3774,3751],{"class":49},[32,3776,302],{"class":49},[32,3778,3779],{"class":38},"               # 递归+行号+忽略大小写\n",[32,3781,3782,3784,3786,3788,3790,3792,3794,3796],{"class":34,"line":106},[32,3783,3748],{"class":45},[32,3785,1176],{"class":53},[32,3787,3751],{"class":49},[32,3789,280],{"class":279},[32,3791,283],{"class":49},[32,3793,287],{"class":286},[32,3795,290],{"class":279},[32,3797,3798],{"class":38},"                # 反选\n",[32,3800,3801,3803,3806,3809,3811,3813,3815,3817],{"class":34,"line":111},[32,3802,3748],{"class":45},[32,3804,3805],{"class":53}," -E",[32,3807,3808],{"class":49}," \"a|b\"",[32,3810,280],{"class":279},[32,3812,283],{"class":49},[32,3814,287],{"class":286},[32,3816,290],{"class":279},[32,3818,3819],{"class":38},"              # 扩展正则\n",[32,3821,3822,3825,3827],{"class":34,"line":117},[32,3823,3824],{"class":45},"rg",[32,3826,3751],{"class":49},[32,3828,3829],{"class":38},"                            # ripgrep（快，推荐）\n",[32,3831,3832],{"class":34,"line":132},[32,3833,82],{"emptyLinePlaceholder":81},[32,3835,3836,3839,3842,3844,3846,3848,3850],{"class":34,"line":137},[32,3837,3838],{"class":45},"sed",[32,3840,3841],{"class":49}," 's\u002Fold\u002Fnew\u002Fg'",[32,3843,280],{"class":279},[32,3845,283],{"class":49},[32,3847,287],{"class":286},[32,3849,290],{"class":279},[32,3851,3852],{"class":38},"          # 替换到 stdout\n",[32,3854,3855,3857,3859,3861,3863,3865,3867,3869],{"class":34,"line":143},[32,3856,3838],{"class":45},[32,3858,704],{"class":53},[32,3860,3841],{"class":49},[32,3862,280],{"class":279},[32,3864,283],{"class":49},[32,3866,287],{"class":286},[32,3868,290],{"class":279},[32,3870,3871],{"class":38},"       # 原地替换\n",[32,3873,3874,3876,3879,3881,3883,3885,3887,3889],{"class":34,"line":158},[32,3875,3838],{"class":45},[32,3877,3878],{"class":53}," -i.bak",[32,3880,3841],{"class":49},[32,3882,280],{"class":279},[32,3884,283],{"class":49},[32,3886,287],{"class":286},[32,3888,290],{"class":279},[32,3890,3891],{"class":38},"   # 带备份\n",[32,3893,3894,3896,3898,3901,3903,3905,3907,3909],{"class":34,"line":163},[32,3895,3838],{"class":45},[32,3897,3689],{"class":53},[32,3899,3900],{"class":49}," '10,20p'",[32,3902,280],{"class":279},[32,3904,283],{"class":49},[32,3906,287],{"class":286},[32,3908,290],{"class":279},[32,3910,3911],{"class":38},"            # 打印范围\n",[32,3913,3914],{"class":34,"line":169},[32,3915,82],{"emptyLinePlaceholder":81},[32,3917,3918,3921,3924,3926,3928,3930,3932],{"class":34,"line":184},[32,3919,3920],{"class":45},"awk",[32,3922,3923],{"class":49}," '{print $1}'",[32,3925,280],{"class":279},[32,3927,283],{"class":49},[32,3929,287],{"class":286},[32,3931,290],{"class":279},[32,3933,3934],{"class":38},"           # 第一列\n",[32,3936,3937,3939,3942,3944],{"class":34,"line":199},[32,3938,3920],{"class":45},[32,3940,3941],{"class":53}," -F:",[32,3943,3923],{"class":49},[32,3945,3946],{"class":49}," \u002Fetc\u002Fpasswd\n",[32,3948,3949,3951,3954,3956,3958,3960],{"class":34,"line":214},[32,3950,3920],{"class":45},[32,3952,3953],{"class":49}," '$3 > 100 {print $1}'",[32,3955,280],{"class":279},[32,3957,283],{"class":49},[32,3959,287],{"class":286},[32,3961,1000],{"class":279},[32,3963,3964],{"class":34,"line":229},[32,3965,82],{"emptyLinePlaceholder":81},[32,3967,3968,3971,3974,3977],{"class":34,"line":234},[32,3969,3970],{"class":45},"cut",[32,3972,3973],{"class":53}," -d:",[32,3975,3976],{"class":53}," -f1",[32,3978,3946],{"class":49},[32,3980,3981,3984,3986,3988,3990],{"class":34,"line":240},[32,3982,3983],{"class":45},"sort",[32,3985,280],{"class":279},[32,3987,283],{"class":49},[32,3989,287],{"class":286},[32,3991,1000],{"class":279},[32,3993,3994,3996,3998,4000,4002,4004,4006],{"class":34,"line":2204},[32,3995,3983],{"class":45},[32,3997,1076],{"class":53},[32,3999,280],{"class":279},[32,4001,283],{"class":49},[32,4003,287],{"class":286},[32,4005,290],{"class":279},[32,4007,4008],{"class":38},"                    # 去重\n",[32,4010,4011,4014,4016],{"class":34,"line":2210},[32,4012,4013],{"class":45},"uniq",[32,4015,526],{"class":53},[32,4017,4018],{"class":38},"                           # 统计相邻（先 sort）\n",[32,4020,4022,4025,4028,4030,4032,4034],{"class":34,"line":4021},24,[32,4023,4024],{"class":45},"wc",[32,4026,4027],{"class":53}," -l",[32,4029,280],{"class":279},[32,4031,283],{"class":49},[32,4033,287],{"class":286},[32,4035,1000],{"class":279},[32,4037,4039,4041,4044],{"class":34,"line":4038},25,[32,4040,735],{"class":45},[32,4042,4043],{"class":49}," 'a-z'",[32,4045,4046],{"class":49}," 'A-Z'\n",[369,4048,4049],{"id":4049},"管道组合",[22,4051,4053],{"className":24,"code":4052,"language":26,"meta":27,"style":27},"awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10\ndu -sh *\u002F | sort -rh | head -10\n",[29,4054,4055,4090],{"__ignoreMap":27},[32,4056,4057,4059,4061,4064,4066,4069,4071,4074,4076,4078,4080,4083,4085,4087],{"class":34,"line":35},[32,4058,3920],{"class":45},[32,4060,3923],{"class":49},[32,4062,4063],{"class":49}," access.log",[32,4065,3126],{"class":279},[32,4067,4068],{"class":45}," sort",[32,4070,3126],{"class":279},[32,4072,4073],{"class":45}," uniq",[32,4075,526],{"class":53},[32,4077,3126],{"class":279},[32,4079,4068],{"class":45},[32,4081,4082],{"class":53}," -rn",[32,4084,3126],{"class":279},[32,4086,3686],{"class":45},[32,4088,4089],{"class":53}," -10\n",[32,4091,4092,4095,4098,4101,4104,4106,4108,4111,4113,4115],{"class":34,"line":42},[32,4093,4094],{"class":45},"du",[32,4096,4097],{"class":53}," -sh",[32,4099,4100],{"class":2598}," *",[32,4102,4103],{"class":49},"\u002F",[32,4105,3126],{"class":279},[32,4107,4068],{"class":45},[32,4109,4110],{"class":53}," -rh",[32,4112,3126],{"class":279},[32,4114,3686],{"class":45},[32,4116,4089],{"class":53},[17,4118,4120],{"id":4119},"四权限","四、权限",[22,4122,4124],{"className":24,"code":4123,"language":26,"meta":27,"style":27},"chmod 755 \u003Cfile>\nchmod +x \u003Cfile>\nchmod -R 644 \u003Cdir>\nchown user:group \u003Cfile>\nchown -R user \u003Cdir>\nchgrp group \u003Cfile>\numask\n",[29,4125,4126,4142,4157,4174,4190,4207,4223],{"__ignoreMap":27},[32,4127,4128,4131,4134,4136,4138,4140],{"class":34,"line":35},[32,4129,4130],{"class":45},"chmod",[32,4132,4133],{"class":53}," 755",[32,4135,280],{"class":279},[32,4137,283],{"class":49},[32,4139,287],{"class":286},[32,4141,1000],{"class":279},[32,4143,4144,4146,4149,4151,4153,4155],{"class":34,"line":42},[32,4145,4130],{"class":45},[32,4147,4148],{"class":49}," +x",[32,4150,280],{"class":279},[32,4152,283],{"class":49},[32,4154,287],{"class":286},[32,4156,1000],{"class":279},[32,4158,4159,4161,4164,4166,4168,4170,4172],{"class":34,"line":63},[32,4160,4130],{"class":45},[32,4162,4163],{"class":53}," -R",[32,4165,3602],{"class":53},[32,4167,280],{"class":279},[32,4169,3376],{"class":49},[32,4171,3379],{"class":286},[32,4173,1000],{"class":279},[32,4175,4176,4179,4182,4184,4186,4188],{"class":34,"line":78},[32,4177,4178],{"class":45},"chown",[32,4180,4181],{"class":49}," user:group",[32,4183,280],{"class":279},[32,4185,283],{"class":49},[32,4187,287],{"class":286},[32,4189,1000],{"class":279},[32,4191,4192,4194,4196,4199,4201,4203,4205],{"class":34,"line":85},[32,4193,4178],{"class":45},[32,4195,4163],{"class":53},[32,4197,4198],{"class":49}," user",[32,4200,280],{"class":279},[32,4202,3376],{"class":49},[32,4204,3379],{"class":286},[32,4206,1000],{"class":279},[32,4208,4209,4212,4215,4217,4219,4221],{"class":34,"line":91},[32,4210,4211],{"class":45},"chgrp",[32,4213,4214],{"class":49}," group",[32,4216,280],{"class":279},[32,4218,283],{"class":49},[32,4220,287],{"class":286},[32,4222,1000],{"class":279},[32,4224,4225],{"class":34,"line":106},[32,4226,4227],{"class":3324},"umask\n",[13,4229,4230],{},"数字权限：",[729,4232,4233,4243],{},[732,4234,4235],{},[735,4236,4237,4240],{},[738,4238,4239],{},"数字",[738,4241,4242],{},"权限",[751,4244,4245,4253,4261,4269],{},[735,4246,4247,4250],{},[756,4248,4249],{},"4",[756,4251,4252],{},"r--",[735,4254,4255,4258],{},[756,4256,4257],{},"5",[756,4259,4260],{},"r-x",[735,4262,4263,4266],{},[756,4264,4265],{},"6",[756,4267,4268],{},"rw-",[735,4270,4271,4274],{},[756,4272,4273],{},"7",[756,4275,4276],{},"rwx",[13,4278,4279,4280,4283,4284,4287,4288,4283,4291,1911],{},"例：",[29,4281,4282],{},"755"," = ",[29,4285,4286],{},"rwxr-xr-x","，",[29,4289,4290],{},"644",[29,4292,4293],{},"rw-r--r--",[13,4295,4296],{},"特殊权限：",[22,4298,4300],{"className":24,"code":4299,"language":26,"meta":27,"style":27},"chmod u+s \u003Cfile>                  # SUID\nchmod g+s \u003Cdir>                   # SGID\nchmod +t \u003Cdir>                    # Sticky（如 \u002Ftmp）\n",[29,4301,4302,4320,4338],{"__ignoreMap":27},[32,4303,4304,4306,4309,4311,4313,4315,4317],{"class":34,"line":35},[32,4305,4130],{"class":45},[32,4307,4308],{"class":49}," u+s",[32,4310,280],{"class":279},[32,4312,283],{"class":49},[32,4314,287],{"class":286},[32,4316,290],{"class":279},[32,4318,4319],{"class":38},"                  # SUID\n",[32,4321,4322,4324,4327,4329,4331,4333,4335],{"class":34,"line":42},[32,4323,4130],{"class":45},[32,4325,4326],{"class":49}," g+s",[32,4328,280],{"class":279},[32,4330,3376],{"class":49},[32,4332,3379],{"class":286},[32,4334,290],{"class":279},[32,4336,4337],{"class":38},"                   # SGID\n",[32,4339,4340,4342,4345,4347,4349,4351,4353],{"class":34,"line":63},[32,4341,4130],{"class":45},[32,4343,4344],{"class":49}," +t",[32,4346,280],{"class":279},[32,4348,3376],{"class":49},[32,4350,3379],{"class":286},[32,4352,290],{"class":279},[32,4354,4355],{"class":38},"                    # Sticky（如 \u002Ftmp）\n",[17,4357,4359],{"id":4358},"五进程管理","五、进程管理",[22,4361,4363],{"className":24,"code":4362,"language":26,"meta":27,"style":27},"ps aux\nps aux | grep nginx\npgrep -f \"pattern\"\npidof \u003Cname>\n\ntop                               # P 按 CPU，M 按内存\nhtop                              # 更友好\n\nkill \u003Cpid>                        # SIGTERM\nkill -9 \u003Cpid>                     # 强制\npkill -f \"pattern\"\nkillall \u003Cname>\n\nnice -n 10 \u003Ccmd>\nrenice -n 5 -p \u003Cpid>\n\nCtrl+Z                            # 挂起\nbg \u002F fg \u002F jobs\n",[29,4364,4365,4373,4387,4397,4410,4414,4422,4430,4434,4451,4469,4478,4491,4495,4513,4532,4536,4544],{"__ignoreMap":27},[32,4366,4367,4370],{"class":34,"line":35},[32,4368,4369],{"class":45},"ps",[32,4371,4372],{"class":49}," aux\n",[32,4374,4375,4377,4380,4382,4384],{"class":34,"line":42},[32,4376,4369],{"class":45},[32,4378,4379],{"class":49}," aux",[32,4381,3126],{"class":279},[32,4383,3129],{"class":45},[32,4385,4386],{"class":49}," nginx\n",[32,4388,4389,4392,4394],{"class":34,"line":63},[32,4390,4391],{"class":45},"pgrep",[32,4393,3710],{"class":53},[32,4395,4396],{"class":49}," \"pattern\"\n",[32,4398,4399,4402,4404,4406,4408],{"class":34,"line":78},[32,4400,4401],{"class":45},"pidof",[32,4403,280],{"class":279},[32,4405,492],{"class":49},[32,4407,287],{"class":286},[32,4409,1000],{"class":279},[32,4411,4412],{"class":34,"line":85},[32,4413,82],{"emptyLinePlaceholder":81},[32,4415,4416,4419],{"class":34,"line":91},[32,4417,4418],{"class":45},"top",[32,4420,4421],{"class":38},"                               # P 按 CPU，M 按内存\n",[32,4423,4424,4427],{"class":34,"line":106},[32,4425,4426],{"class":45},"htop",[32,4428,4429],{"class":38},"                              # 更友好\n",[32,4431,4432],{"class":34,"line":111},[32,4433,82],{"emptyLinePlaceholder":81},[32,4435,4436,4439,4441,4444,4446,4448],{"class":34,"line":117},[32,4437,4438],{"class":3324},"kill",[32,4440,280],{"class":279},[32,4442,4443],{"class":49},"pi",[32,4445,614],{"class":286},[32,4447,290],{"class":279},[32,4449,4450],{"class":38},"                        # SIGTERM\n",[32,4452,4453,4455,4458,4460,4462,4464,4466],{"class":34,"line":132},[32,4454,4438],{"class":3324},[32,4456,4457],{"class":53}," -9",[32,4459,280],{"class":279},[32,4461,4443],{"class":49},[32,4463,614],{"class":286},[32,4465,290],{"class":279},[32,4467,4468],{"class":38},"                     # 强制\n",[32,4470,4471,4474,4476],{"class":34,"line":137},[32,4472,4473],{"class":45},"pkill",[32,4475,3710],{"class":53},[32,4477,4396],{"class":49},[32,4479,4480,4483,4485,4487,4489],{"class":34,"line":143},[32,4481,4482],{"class":45},"killall",[32,4484,280],{"class":279},[32,4486,492],{"class":49},[32,4488,287],{"class":286},[32,4490,1000],{"class":279},[32,4492,4493],{"class":34,"line":158},[32,4494,82],{"emptyLinePlaceholder":81},[32,4496,4497,4500,4502,4505,4507,4509,4511],{"class":34,"line":163},[32,4498,4499],{"class":45},"nice",[32,4501,3689],{"class":53},[32,4503,4504],{"class":53}," 10",[32,4506,280],{"class":279},[32,4508,3625],{"class":49},[32,4510,614],{"class":286},[32,4512,1000],{"class":279},[32,4514,4515,4518,4520,4522,4524,4526,4528,4530],{"class":34,"line":169},[32,4516,4517],{"class":45},"renice",[32,4519,3689],{"class":53},[32,4521,2840],{"class":53},[32,4523,1494],{"class":53},[32,4525,280],{"class":279},[32,4527,4443],{"class":49},[32,4529,614],{"class":286},[32,4531,1000],{"class":279},[32,4533,4534],{"class":34,"line":184},[32,4535,82],{"emptyLinePlaceholder":81},[32,4537,4538,4541],{"class":34,"line":199},[32,4539,4540],{"class":45},"Ctrl+Z",[32,4542,4543],{"class":38},"                            # 挂起\n",[32,4545,4546,4549,4551,4554,4556],{"class":34,"line":214},[32,4547,4548],{"class":3324},"bg",[32,4550,3678],{"class":49},[32,4552,4553],{"class":49}," fg",[32,4555,3678],{"class":49},[32,4557,4558],{"class":49}," jobs\n",[13,4560,4561],{},"信号：",[729,4563,4564,4576],{},[732,4565,4566],{},[735,4567,4568,4571,4574],{},[738,4569,4570],{},"信号",[738,4572,4573],{},"编号",[738,4575,1938],{},[751,4577,4578,4589,4600,4611],{},[735,4579,4580,4583,4586],{},[756,4581,4582],{},"SIGHUP",[756,4584,4585],{},"1",[756,4587,4588],{},"挂起 \u002F 重载",[735,4590,4591,4594,4597],{},[756,4592,4593],{},"SIGINT",[756,4595,4596],{},"2",[756,4598,4599],{},"Ctrl+C",[735,4601,4602,4605,4608],{},[756,4603,4604],{},"SIGKILL",[756,4606,4607],{},"9",[756,4609,4610],{},"强杀，不可捕获",[735,4612,4613,4616,4619],{},[756,4614,4615],{},"SIGTERM",[756,4617,4618],{},"15",[756,4620,4621],{},"优雅退出（默认）",[17,4623,4625],{"id":4624},"六网络","六、网络",[22,4627,4629],{"className":24,"code":4628,"language":26,"meta":27,"style":27},"ip addr                           # 查看 IP\nip route\nss -tunlp                         # 监听端口（推荐）\nnetstat -tunlp                    # 老命令\nlsof -i :8080                     # 谁占端口\n\nping \u003Chost>\nping -c 4 \u003Chost>\ntraceroute \u003Chost>\nmtr \u003Chost>                        # 持续 traceroute\n\ncurl -I \u003Curl>                     # 只看头\ncurl -v \u003Curl>                     # 详细\ncurl -o file.zip \u003Curl>            # 下载\ncurl -X POST -d '{}' -H \"Content-Type: application\u002Fjson\" \u003Curl>\n\nwget \u003Curl>\nwget -c \u003Curl>                     # 断点续传\nwget -r -np \u003Curl>                 # 递归\n\ndig \u003Cdomain>\ndig +short \u003Cdomain>\nnslookup \u003Cdomain>\nhost \u003Cdomain>\n",[29,4630,4631,4642,4649,4660,4670,4683,4687,4701,4718,4731,4747,4751,4770,4787,4808,4837,4841,4854,4871,4891,4895,4910,4925,4938],{"__ignoreMap":27},[32,4632,4633,4636,4639],{"class":34,"line":35},[32,4634,4635],{"class":45},"ip",[32,4637,4638],{"class":49}," addr",[32,4640,4641],{"class":38},"                           # 查看 IP\n",[32,4643,4644,4646],{"class":34,"line":42},[32,4645,4635],{"class":45},[32,4647,4648],{"class":49}," route\n",[32,4650,4651,4654,4657],{"class":34,"line":63},[32,4652,4653],{"class":45},"ss",[32,4655,4656],{"class":53}," -tunlp",[32,4658,4659],{"class":38},"                         # 监听端口（推荐）\n",[32,4661,4662,4665,4667],{"class":34,"line":78},[32,4663,4664],{"class":45},"netstat",[32,4666,4656],{"class":53},[32,4668,4669],{"class":38},"                    # 老命令\n",[32,4671,4672,4675,4677,4680],{"class":34,"line":85},[32,4673,4674],{"class":45},"lsof",[32,4676,704],{"class":53},[32,4678,4679],{"class":49}," :8080",[32,4681,4682],{"class":38},"                     # 谁占端口\n",[32,4684,4685],{"class":34,"line":91},[32,4686,82],{"emptyLinePlaceholder":81},[32,4688,4689,4692,4694,4697,4699],{"class":34,"line":106},[32,4690,4691],{"class":45},"ping",[32,4693,280],{"class":279},[32,4695,4696],{"class":49},"hos",[32,4698,1583],{"class":286},[32,4700,1000],{"class":279},[32,4702,4703,4705,4707,4710,4712,4714,4716],{"class":34,"line":111},[32,4704,4691],{"class":45},[32,4706,526],{"class":53},[32,4708,4709],{"class":53}," 4",[32,4711,280],{"class":279},[32,4713,4696],{"class":49},[32,4715,1583],{"class":286},[32,4717,1000],{"class":279},[32,4719,4720,4723,4725,4727,4729],{"class":34,"line":117},[32,4721,4722],{"class":45},"traceroute",[32,4724,280],{"class":279},[32,4726,4696],{"class":49},[32,4728,1583],{"class":286},[32,4730,1000],{"class":279},[32,4732,4733,4736,4738,4740,4742,4744],{"class":34,"line":132},[32,4734,4735],{"class":45},"mtr",[32,4737,280],{"class":279},[32,4739,4696],{"class":49},[32,4741,1583],{"class":286},[32,4743,290],{"class":279},[32,4745,4746],{"class":38},"                        # 持续 traceroute\n",[32,4748,4749],{"class":34,"line":137},[32,4750,82],{"emptyLinePlaceholder":81},[32,4752,4753,4756,4759,4761,4763,4765,4767],{"class":34,"line":143},[32,4754,4755],{"class":45},"curl",[32,4757,4758],{"class":53}," -I",[32,4760,280],{"class":279},[32,4762,1195],{"class":49},[32,4764,1198],{"class":286},[32,4766,290],{"class":279},[32,4768,4769],{"class":38},"                     # 只看头\n",[32,4771,4772,4774,4776,4778,4780,4782,4784],{"class":34,"line":158},[32,4773,4755],{"class":45},[32,4775,1176],{"class":53},[32,4777,280],{"class":279},[32,4779,1195],{"class":49},[32,4781,1198],{"class":286},[32,4783,290],{"class":279},[32,4785,4786],{"class":38},"                     # 详细\n",[32,4788,4789,4791,4794,4797,4799,4801,4803,4805],{"class":34,"line":163},[32,4790,4755],{"class":45},[32,4792,4793],{"class":53}," -o",[32,4795,4796],{"class":49}," file.zip",[32,4798,280],{"class":279},[32,4800,1195],{"class":49},[32,4802,1198],{"class":286},[32,4804,290],{"class":279},[32,4806,4807],{"class":38},"            # 下载\n",[32,4809,4810,4812,4815,4818,4820,4823,4826,4829,4831,4833,4835],{"class":34,"line":169},[32,4811,4755],{"class":45},[32,4813,4814],{"class":53}," -X",[32,4816,4817],{"class":49}," POST",[32,4819,567],{"class":53},[32,4821,4822],{"class":49}," '{}'",[32,4824,4825],{"class":53}," -H",[32,4827,4828],{"class":49}," \"Content-Type: application\u002Fjson\"",[32,4830,280],{"class":279},[32,4832,1195],{"class":49},[32,4834,1198],{"class":286},[32,4836,1000],{"class":279},[32,4838,4839],{"class":34,"line":184},[32,4840,82],{"emptyLinePlaceholder":81},[32,4842,4843,4846,4848,4850,4852],{"class":34,"line":199},[32,4844,4845],{"class":45},"wget",[32,4847,280],{"class":279},[32,4849,1195],{"class":49},[32,4851,1198],{"class":286},[32,4853,1000],{"class":279},[32,4855,4856,4858,4860,4862,4864,4866,4868],{"class":34,"line":214},[32,4857,4845],{"class":45},[32,4859,526],{"class":53},[32,4861,280],{"class":279},[32,4863,1195],{"class":49},[32,4865,1198],{"class":286},[32,4867,290],{"class":279},[32,4869,4870],{"class":38},"                     # 断点续传\n",[32,4872,4873,4875,4877,4880,4882,4884,4886,4888],{"class":34,"line":229},[32,4874,4845],{"class":45},[32,4876,1876],{"class":53},[32,4878,4879],{"class":53}," -np",[32,4881,280],{"class":279},[32,4883,1195],{"class":49},[32,4885,1198],{"class":286},[32,4887,290],{"class":279},[32,4889,4890],{"class":38},"                 # 递归\n",[32,4892,4893],{"class":34,"line":234},[32,4894,82],{"emptyLinePlaceholder":81},[32,4896,4897,4900,4902,4905,4908],{"class":34,"line":240},[32,4898,4899],{"class":45},"dig",[32,4901,280],{"class":279},[32,4903,4904],{"class":49},"domai",[32,4906,4907],{"class":286},"n",[32,4909,1000],{"class":279},[32,4911,4912,4914,4917,4919,4921,4923],{"class":34,"line":2204},[32,4913,4899],{"class":45},[32,4915,4916],{"class":49}," +short",[32,4918,280],{"class":279},[32,4920,4904],{"class":49},[32,4922,4907],{"class":286},[32,4924,1000],{"class":279},[32,4926,4927,4930,4932,4934,4936],{"class":34,"line":2210},[32,4928,4929],{"class":45},"nslookup",[32,4931,280],{"class":279},[32,4933,4904],{"class":49},[32,4935,4907],{"class":286},[32,4937,1000],{"class":279},[32,4939,4940,4943,4945,4947,4949],{"class":34,"line":4021},[32,4941,4942],{"class":45},"host",[32,4944,280],{"class":279},[32,4946,4904],{"class":49},[32,4948,4907],{"class":286},[32,4950,1000],{"class":279},[369,4952,4953],{"id":4953},"防火墙",[22,4955,4957],{"className":24,"code":4956,"language":26,"meta":27,"style":27},"# ufw（Ubuntu）\nufw status\nufw allow 22\nufw allow 80\u002Ftcp\nufw delete allow 80\nufw enable\n\n# firewalld（CentOS）\nfirewall-cmd --list-all\nfirewall-cmd --add-port=8080\u002Ftcp --permanent\nfirewall-cmd --reload\n\n# iptables\niptables -L -n -v\niptables -A INPUT -p tcp --dport 8080 -j ACCEPT\n",[29,4958,4959,4964,4971,4981,4990,5002,5009,5013,5018,5026,5036,5043,5047,5052,5065],{"__ignoreMap":27},[32,4960,4961],{"class":34,"line":35},[32,4962,4963],{"class":38},"# ufw（Ubuntu）\n",[32,4965,4966,4969],{"class":34,"line":42},[32,4967,4968],{"class":45},"ufw",[32,4970,181],{"class":49},[32,4972,4973,4975,4978],{"class":34,"line":63},[32,4974,4968],{"class":45},[32,4976,4977],{"class":49}," allow",[32,4979,4980],{"class":53}," 22\n",[32,4982,4983,4985,4987],{"class":34,"line":78},[32,4984,4968],{"class":45},[32,4986,4977],{"class":49},[32,4988,4989],{"class":49}," 80\u002Ftcp\n",[32,4991,4992,4994,4997,4999],{"class":34,"line":85},[32,4993,4968],{"class":45},[32,4995,4996],{"class":49}," delete",[32,4998,4977],{"class":49},[32,5000,5001],{"class":53}," 80\n",[32,5003,5004,5006],{"class":34,"line":91},[32,5005,4968],{"class":45},[32,5007,5008],{"class":49}," enable\n",[32,5010,5011],{"class":34,"line":106},[32,5012,82],{"emptyLinePlaceholder":81},[32,5014,5015],{"class":34,"line":111},[32,5016,5017],{"class":38},"# firewalld（CentOS）\n",[32,5019,5020,5023],{"class":34,"line":117},[32,5021,5022],{"class":45},"firewall-cmd",[32,5024,5025],{"class":53}," --list-all\n",[32,5027,5028,5030,5033],{"class":34,"line":132},[32,5029,5022],{"class":45},[32,5031,5032],{"class":53}," --add-port=8080\u002Ftcp",[32,5034,5035],{"class":53}," --permanent\n",[32,5037,5038,5040],{"class":34,"line":137},[32,5039,5022],{"class":45},[32,5041,5042],{"class":53}," --reload\n",[32,5044,5045],{"class":34,"line":143},[32,5046,82],{"emptyLinePlaceholder":81},[32,5048,5049],{"class":34,"line":158},[32,5050,5051],{"class":38},"# iptables\n",[32,5053,5054,5057,5060,5062],{"class":34,"line":163},[32,5055,5056],{"class":45},"iptables",[32,5058,5059],{"class":53}," -L",[32,5061,3689],{"class":53},[32,5063,5064],{"class":53}," -v\n",[32,5066,5067,5069,5071,5074,5076,5079,5082,5085,5088],{"class":34,"line":169},[32,5068,5056],{"class":45},[32,5070,314],{"class":53},[32,5072,5073],{"class":49}," INPUT",[32,5075,1494],{"class":53},[32,5077,5078],{"class":49}," tcp",[32,5080,5081],{"class":53}," --dport",[32,5083,5084],{"class":53}," 8080",[32,5086,5087],{"class":53}," -j",[32,5089,5090],{"class":49}," ACCEPT\n",[17,5092,5094],{"id":5093},"七磁盘与内存","七、磁盘与内存",[22,5096,5098],{"className":24,"code":5097,"language":26,"meta":27,"style":27},"df -h                             # 磁盘\ndf -i                             # inode\ndu -sh \u003Cdir>\ndu -sh * | sort -rh | head -10\n\nfree -h                           # 内存\nvmstat 1\niostat -x 1                       # 需 sysstat\n\nlsblk\nfdisk -l\nmount \u002Fdev\u002Fsdb1 \u002Fmnt\numount \u002Fmnt\n",[29,5099,5100,5111,5120,5134,5154,5158,5168,5176,5190,5194,5199,5207,5218],{"__ignoreMap":27},[32,5101,5102,5105,5108],{"class":34,"line":35},[32,5103,5104],{"class":45},"df",[32,5106,5107],{"class":53}," -h",[32,5109,5110],{"class":38},"                             # 磁盘\n",[32,5112,5113,5115,5117],{"class":34,"line":42},[32,5114,5104],{"class":45},[32,5116,704],{"class":53},[32,5118,5119],{"class":38},"                             # inode\n",[32,5121,5122,5124,5126,5128,5130,5132],{"class":34,"line":63},[32,5123,4094],{"class":45},[32,5125,4097],{"class":53},[32,5127,280],{"class":279},[32,5129,3376],{"class":49},[32,5131,3379],{"class":286},[32,5133,1000],{"class":279},[32,5135,5136,5138,5140,5142,5144,5146,5148,5150,5152],{"class":34,"line":78},[32,5137,4094],{"class":45},[32,5139,4097],{"class":53},[32,5141,4100],{"class":2598},[32,5143,3126],{"class":279},[32,5145,4068],{"class":45},[32,5147,4110],{"class":53},[32,5149,3126],{"class":279},[32,5151,3686],{"class":45},[32,5153,4089],{"class":53},[32,5155,5156],{"class":34,"line":85},[32,5157,82],{"emptyLinePlaceholder":81},[32,5159,5160,5163,5165],{"class":34,"line":91},[32,5161,5162],{"class":45},"free",[32,5164,5107],{"class":53},[32,5166,5167],{"class":38},"                           # 内存\n",[32,5169,5170,5173],{"class":34,"line":106},[32,5171,5172],{"class":45},"vmstat",[32,5174,5175],{"class":53}," 1\n",[32,5177,5178,5181,5184,5187],{"class":34,"line":111},[32,5179,5180],{"class":45},"iostat",[32,5182,5183],{"class":53}," -x",[32,5185,5186],{"class":53}," 1",[32,5188,5189],{"class":38},"                       # 需 sysstat\n",[32,5191,5192],{"class":34,"line":117},[32,5193,82],{"emptyLinePlaceholder":81},[32,5195,5196],{"class":34,"line":132},[32,5197,5198],{"class":45},"lsblk\n",[32,5200,5201,5204],{"class":34,"line":137},[32,5202,5203],{"class":45},"fdisk",[32,5205,5206],{"class":53}," -l\n",[32,5208,5209,5212,5215],{"class":34,"line":143},[32,5210,5211],{"class":45},"mount",[32,5213,5214],{"class":49}," \u002Fdev\u002Fsdb1",[32,5216,5217],{"class":49}," \u002Fmnt\n",[32,5219,5220,5223],{"class":34,"line":158},[32,5221,5222],{"class":45},"umount",[32,5224,5217],{"class":49},[13,5226,5227],{},"找大文件：",[22,5229,5231],{"className":24,"code":5230,"language":26,"meta":27,"style":27},"find \u002F -type f -size +1G 2>\u002Fdev\u002Fnull\ndu -ah \u002F | sort -rh | head -20\n",[29,5232,5233,5254],{"__ignoreMap":27},[32,5234,5235,5237,5239,5241,5243,5245,5248,5251],{"class":34,"line":35},[32,5236,3519],{"class":45},[32,5238,3678],{"class":49},[32,5240,3539],{"class":53},[32,5242,3542],{"class":49},[32,5244,3545],{"class":53},[32,5246,5247],{"class":49}," +1G",[32,5249,5250],{"class":279}," 2>",[32,5252,5253],{"class":49},"\u002Fdev\u002Fnull\n",[32,5255,5256,5258,5261,5263,5265,5267,5269,5271,5273],{"class":34,"line":42},[32,5257,4094],{"class":45},[32,5259,5260],{"class":53}," -ah",[32,5262,3678],{"class":49},[32,5264,3126],{"class":279},[32,5266,4068],{"class":45},[32,5268,4110],{"class":53},[32,5270,3126],{"class":279},[32,5272,3686],{"class":45},[32,5274,5275],{"class":53}," -20\n",[17,5277,5279],{"id":5278},"八压缩与归档","八、压缩与归档",[22,5281,5283],{"className":24,"code":5282,"language":26,"meta":27,"style":27},"tar -czvf a.tar.gz \u003Cdir>          # 打包\ntar -xzvf a.tar.gz                # 解包\ntar -tzvf a.tar.gz                # 查看内容\ntar -xzvf a.tar.gz -C \u002Ftmp\n\nzip -r a.zip \u003Cdir>\nunzip a.zip\nunzip -l a.zip\nunzip a.zip -d \u002Ftmp\n\ngzip \u003Cfile>\ngunzip \u003Cfile>.gz\n\nzstd \u003Cfile>                       # 快速压缩\nxz -9 \u003Cfile>                      # 高压缩\n",[29,5284,5285,5307,5319,5331,5345,5349,5367,5375,5383,5393,5397,5410,5426,5430,5446],{"__ignoreMap":27},[32,5286,5287,5290,5293,5296,5298,5300,5302,5304],{"class":34,"line":35},[32,5288,5289],{"class":45},"tar",[32,5291,5292],{"class":53}," -czvf",[32,5294,5295],{"class":49}," a.tar.gz",[32,5297,280],{"class":279},[32,5299,3376],{"class":49},[32,5301,3379],{"class":286},[32,5303,290],{"class":279},[32,5305,5306],{"class":38},"          # 打包\n",[32,5308,5309,5311,5314,5316],{"class":34,"line":42},[32,5310,5289],{"class":45},[32,5312,5313],{"class":53}," -xzvf",[32,5315,5295],{"class":49},[32,5317,5318],{"class":38},"                # 解包\n",[32,5320,5321,5323,5326,5328],{"class":34,"line":63},[32,5322,5289],{"class":45},[32,5324,5325],{"class":53}," -tzvf",[32,5327,5295],{"class":49},[32,5329,5330],{"class":38},"                # 查看内容\n",[32,5332,5333,5335,5337,5339,5342],{"class":34,"line":78},[32,5334,5289],{"class":45},[32,5336,5313],{"class":53},[32,5338,5295],{"class":49},[32,5340,5341],{"class":53}," -C",[32,5343,5344],{"class":49}," \u002Ftmp\n",[32,5346,5347],{"class":34,"line":85},[32,5348,82],{"emptyLinePlaceholder":81},[32,5350,5351,5354,5356,5359,5361,5363,5365],{"class":34,"line":91},[32,5352,5353],{"class":45},"zip",[32,5355,1876],{"class":53},[32,5357,5358],{"class":49}," a.zip",[32,5360,280],{"class":279},[32,5362,3376],{"class":49},[32,5364,3379],{"class":286},[32,5366,1000],{"class":279},[32,5368,5369,5372],{"class":34,"line":106},[32,5370,5371],{"class":45},"unzip",[32,5373,5374],{"class":49}," a.zip\n",[32,5376,5377,5379,5381],{"class":34,"line":111},[32,5378,5371],{"class":45},[32,5380,4027],{"class":53},[32,5382,5374],{"class":49},[32,5384,5385,5387,5389,5391],{"class":34,"line":117},[32,5386,5371],{"class":45},[32,5388,5358],{"class":49},[32,5390,567],{"class":53},[32,5392,5344],{"class":49},[32,5394,5395],{"class":34,"line":132},[32,5396,82],{"emptyLinePlaceholder":81},[32,5398,5399,5402,5404,5406,5408],{"class":34,"line":137},[32,5400,5401],{"class":45},"gzip",[32,5403,280],{"class":279},[32,5405,283],{"class":49},[32,5407,287],{"class":286},[32,5409,1000],{"class":279},[32,5411,5412,5415,5417,5419,5421,5423],{"class":34,"line":143},[32,5413,5414],{"class":45},"gunzip",[32,5416,280],{"class":279},[32,5418,283],{"class":49},[32,5420,287],{"class":286},[32,5422,290],{"class":279},[32,5424,5425],{"class":49},".gz\n",[32,5427,5428],{"class":34,"line":158},[32,5429,82],{"emptyLinePlaceholder":81},[32,5431,5432,5435,5437,5439,5441,5443],{"class":34,"line":163},[32,5433,5434],{"class":45},"zstd",[32,5436,280],{"class":279},[32,5438,283],{"class":49},[32,5440,287],{"class":286},[32,5442,290],{"class":279},[32,5444,5445],{"class":38},"                       # 快速压缩\n",[32,5447,5448,5451,5453,5455,5457,5459,5461],{"class":34,"line":169},[32,5449,5450],{"class":45},"xz",[32,5452,4457],{"class":53},[32,5454,280],{"class":279},[32,5456,283],{"class":49},[32,5458,287],{"class":286},[32,5460,290],{"class":279},[32,5462,5463],{"class":38},"                      # 高压缩\n",[17,5465,5467],{"id":5466},"九用户与权限","九、用户与权限",[22,5469,5471],{"className":24,"code":5470,"language":26,"meta":27,"style":27},"whoami\nid\nwho\nw\nlast\n\nuseradd -m -s \u002Fbin\u002Fbash \u003Cuser>\npasswd \u003Cuser>\nusermod -aG sudo \u003Cuser>\nuserdel -r \u003Cuser>\n\ngroupadd \u003Cgroup>\ngroups \u003Cuser>\n\nsu - \u003Cuser>\nsudo \u003Ccmd>\nsudo -i                           # 进 root shell\nsudo -u \u003Cuser> \u003Ccmd>\n",[29,5472,5473,5478,5483,5488,5493,5498,5502,5523,5536,5555,5570,5574,5588,5601,5605,5620,5632,5641],{"__ignoreMap":27},[32,5474,5475],{"class":34,"line":35},[32,5476,5477],{"class":45},"whoami\n",[32,5479,5480],{"class":34,"line":42},[32,5481,5482],{"class":45},"id\n",[32,5484,5485],{"class":34,"line":63},[32,5486,5487],{"class":45},"who\n",[32,5489,5490],{"class":34,"line":78},[32,5491,5492],{"class":45},"w\n",[32,5494,5495],{"class":34,"line":85},[32,5496,5497],{"class":45},"last\n",[32,5499,5500],{"class":34,"line":91},[32,5501,82],{"emptyLinePlaceholder":81},[32,5503,5504,5507,5509,5511,5514,5516,5519,5521],{"class":34,"line":106},[32,5505,5506],{"class":45},"useradd",[32,5508,327],{"class":53},[32,5510,3445],{"class":53},[32,5512,5513],{"class":49}," \u002Fbin\u002Fbash",[32,5515,280],{"class":279},[32,5517,5518],{"class":49},"use",[32,5520,3379],{"class":286},[32,5522,1000],{"class":279},[32,5524,5525,5528,5530,5532,5534],{"class":34,"line":111},[32,5526,5527],{"class":45},"passwd",[32,5529,280],{"class":279},[32,5531,5518],{"class":49},[32,5533,3379],{"class":286},[32,5535,1000],{"class":279},[32,5537,5538,5541,5544,5547,5549,5551,5553],{"class":34,"line":117},[32,5539,5540],{"class":45},"usermod",[32,5542,5543],{"class":53}," -aG",[32,5545,5546],{"class":49}," sudo",[32,5548,280],{"class":279},[32,5550,5518],{"class":49},[32,5552,3379],{"class":286},[32,5554,1000],{"class":279},[32,5556,5557,5560,5562,5564,5566,5568],{"class":34,"line":132},[32,5558,5559],{"class":45},"userdel",[32,5561,1876],{"class":53},[32,5563,280],{"class":279},[32,5565,5518],{"class":49},[32,5567,3379],{"class":286},[32,5569,1000],{"class":279},[32,5571,5572],{"class":34,"line":137},[32,5573,82],{"emptyLinePlaceholder":81},[32,5575,5576,5579,5581,5584,5586],{"class":34,"line":143},[32,5577,5578],{"class":45},"groupadd",[32,5580,280],{"class":279},[32,5582,5583],{"class":49},"grou",[32,5585,13],{"class":286},[32,5587,1000],{"class":279},[32,5589,5590,5593,5595,5597,5599],{"class":34,"line":158},[32,5591,5592],{"class":45},"groups",[32,5594,280],{"class":279},[32,5596,5518],{"class":49},[32,5598,3379],{"class":286},[32,5600,1000],{"class":279},[32,5602,5603],{"class":34,"line":163},[32,5604,82],{"emptyLinePlaceholder":81},[32,5606,5607,5610,5612,5614,5616,5618],{"class":34,"line":169},[32,5608,5609],{"class":45},"su",[32,5611,3347],{"class":49},[32,5613,280],{"class":279},[32,5615,5518],{"class":49},[32,5617,3379],{"class":286},[32,5619,1000],{"class":279},[32,5621,5622,5624,5626,5628,5630],{"class":34,"line":184},[32,5623,2386],{"class":45},[32,5625,280],{"class":279},[32,5627,3625],{"class":49},[32,5629,614],{"class":286},[32,5631,1000],{"class":279},[32,5633,5634,5636,5638],{"class":34,"line":199},[32,5635,2386],{"class":45},[32,5637,704],{"class":53},[32,5639,5640],{"class":38},"                           # 进 root shell\n",[32,5642,5643,5645,5647,5649,5651,5653,5655,5657,5659,5661],{"class":34,"line":214},[32,5644,2386],{"class":45},[32,5646,1076],{"class":53},[32,5648,280],{"class":279},[32,5650,5518],{"class":49},[32,5652,3379],{"class":286},[32,5654,290],{"class":279},[32,5656,280],{"class":279},[32,5658,3625],{"class":49},[32,5660,614],{"class":286},[32,5662,1000],{"class":279},[13,5664,5665],{},"sudoers：",[22,5667,5669],{"className":24,"code":5668,"language":26,"meta":27,"style":27},"visudo\n",[29,5670,5671],{"__ignoreMap":27},[32,5672,5673],{"class":34,"line":35},[32,5674,5668],{"class":45},[22,5676,5679],{"className":5677,"code":5678,"language":1921},[1919],"alice ALL=(ALL:ALL) ALL\n%sudo ALL=(ALL:ALL) ALL\nalice ALL=(ALL) NOPASSWD: ALL     # 免密\n",[29,5680,5678],{"__ignoreMap":27},[17,5682,5684],{"id":5683},"十systemd","十、systemd",[22,5686,5688],{"className":24,"code":5687,"language":26,"meta":27,"style":27},"systemctl start\u002Fstop\u002Frestart\u002Freload\u002Fstatus \u003Csvc>\nsystemctl enable\u002Fdisable \u003Csvc>\nsystemctl is-active \u003Csvc>\nsystemctl list-units --type=service --state=running\nsystemctl daemon-reload\n\njournalctl -u \u003Csvc>\njournalctl -u \u003Csvc> -f\njournalctl -u \u003Csvc> --since \"1 hour ago\"\njournalctl -xe                    # 最近错误\njournalctl -b                     # 本次启动\njournalctl --disk-usage\njournalctl --vacuum-size=500M     # 清理\n",[29,5689,5690,5707,5722,5737,5750,5756,5760,5775,5792,5812,5822,5831,5838],{"__ignoreMap":27},[32,5691,5692,5695,5698,5700,5703,5705],{"class":34,"line":35},[32,5693,5694],{"class":45},"systemctl",[32,5696,5697],{"class":49}," start\u002Fstop\u002Frestart\u002Freload\u002Fstatus",[32,5699,280],{"class":279},[32,5701,5702],{"class":49},"sv",[32,5704,3399],{"class":286},[32,5706,1000],{"class":279},[32,5708,5709,5711,5714,5716,5718,5720],{"class":34,"line":42},[32,5710,5694],{"class":45},[32,5712,5713],{"class":49}," enable\u002Fdisable",[32,5715,280],{"class":279},[32,5717,5702],{"class":49},[32,5719,3399],{"class":286},[32,5721,1000],{"class":279},[32,5723,5724,5726,5729,5731,5733,5735],{"class":34,"line":63},[32,5725,5694],{"class":45},[32,5727,5728],{"class":49}," is-active",[32,5730,280],{"class":279},[32,5732,5702],{"class":49},[32,5734,3399],{"class":286},[32,5736,1000],{"class":279},[32,5738,5739,5741,5744,5747],{"class":34,"line":78},[32,5740,5694],{"class":45},[32,5742,5743],{"class":49}," list-units",[32,5745,5746],{"class":53}," --type=service",[32,5748,5749],{"class":53}," --state=running\n",[32,5751,5752,5754],{"class":34,"line":85},[32,5753,5694],{"class":45},[32,5755,3103],{"class":49},[32,5757,5758],{"class":34,"line":91},[32,5759,82],{"emptyLinePlaceholder":81},[32,5761,5762,5765,5767,5769,5771,5773],{"class":34,"line":106},[32,5763,5764],{"class":45},"journalctl",[32,5766,1076],{"class":53},[32,5768,280],{"class":279},[32,5770,5702],{"class":49},[32,5772,3399],{"class":286},[32,5774,1000],{"class":279},[32,5776,5777,5779,5781,5783,5785,5787,5789],{"class":34,"line":111},[32,5778,5764],{"class":45},[32,5780,1076],{"class":53},[32,5782,280],{"class":279},[32,5784,5702],{"class":49},[32,5786,3399],{"class":286},[32,5788,290],{"class":279},[32,5790,5791],{"class":53}," -f\n",[32,5793,5794,5796,5798,5800,5802,5804,5806,5809],{"class":34,"line":117},[32,5795,5764],{"class":45},[32,5797,1076],{"class":53},[32,5799,280],{"class":279},[32,5801,5702],{"class":49},[32,5803,3399],{"class":286},[32,5805,290],{"class":279},[32,5807,5808],{"class":53}," --since",[32,5810,5811],{"class":49}," \"1 hour ago\"\n",[32,5813,5814,5816,5819],{"class":34,"line":132},[32,5815,5764],{"class":45},[32,5817,5818],{"class":53}," -xe",[32,5820,5821],{"class":38},"                    # 最近错误\n",[32,5823,5824,5826,5828],{"class":34,"line":137},[32,5825,5764],{"class":45},[32,5827,547],{"class":53},[32,5829,5830],{"class":38},"                     # 本次启动\n",[32,5832,5833,5835],{"class":34,"line":143},[32,5834,5764],{"class":45},[32,5836,5837],{"class":53}," --disk-usage\n",[32,5839,5840,5842,5845],{"class":34,"line":158},[32,5841,5764],{"class":45},[32,5843,5844],{"class":53}," --vacuum-size=500M",[32,5846,5847],{"class":38},"     # 清理\n",[13,5849,5850,5851,2443],{},"unit 文件示例 ",[29,5852,5853],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service",[22,5855,5859],{"className":5856,"code":5857,"language":5858,"meta":27,"style":27},"language-ini shiki shiki-themes monokai","[Unit]\nDescription=My App\nAfter=network.target\n\n[Service]\nType=simple\nUser=appuser\nWorkingDirectory=\u002Fopt\u002Fmyapp\nExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n","ini",[29,5860,5861,5866,5871,5876,5880,5885,5890,5895,5900,5905,5910,5915,5919,5924],{"__ignoreMap":27},[32,5862,5863],{"class":34,"line":35},[32,5864,5865],{},"[Unit]\n",[32,5867,5868],{"class":34,"line":42},[32,5869,5870],{},"Description=My App\n",[32,5872,5873],{"class":34,"line":63},[32,5874,5875],{},"After=network.target\n",[32,5877,5878],{"class":34,"line":78},[32,5879,82],{"emptyLinePlaceholder":81},[32,5881,5882],{"class":34,"line":85},[32,5883,5884],{},"[Service]\n",[32,5886,5887],{"class":34,"line":91},[32,5888,5889],{},"Type=simple\n",[32,5891,5892],{"class":34,"line":106},[32,5893,5894],{},"User=appuser\n",[32,5896,5897],{"class":34,"line":111},[32,5898,5899],{},"WorkingDirectory=\u002Fopt\u002Fmyapp\n",[32,5901,5902],{"class":34,"line":117},[32,5903,5904],{},"ExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\n",[32,5906,5907],{"class":34,"line":132},[32,5908,5909],{},"Restart=on-failure\n",[32,5911,5912],{"class":34,"line":137},[32,5913,5914],{},"RestartSec=5\n",[32,5916,5917],{"class":34,"line":143},[32,5918,82],{"emptyLinePlaceholder":81},[32,5920,5921],{"class":34,"line":158},[32,5922,5923],{},"[Install]\n",[32,5925,5926],{"class":34,"line":163},[32,5927,5928],{},"WantedBy=multi-user.target\n",[22,5930,5932],{"className":24,"code":5931,"language":26,"meta":27,"style":27},"sudo systemctl daemon-reload\nsudo systemctl enable --now myapp\n",[29,5933,5934,5942],{"__ignoreMap":27},[32,5935,5936,5938,5940],{"class":34,"line":35},[32,5937,2386],{"class":45},[32,5939,3100],{"class":49},[32,5941,3103],{"class":49},[32,5943,5944,5946,5948,5951,5954],{"class":34,"line":42},[32,5945,2386],{"class":45},[32,5947,3100],{"class":49},[32,5949,5950],{"class":49}," enable",[32,5952,5953],{"class":53}," --now",[32,5955,5956],{"class":49}," myapp\n",[17,5958,5960],{"id":5959},"十一ssh","十一、SSH",[22,5962,5964],{"className":24,"code":5963,"language":26,"meta":27,"style":27},"ssh user@host\nssh -p 2222 user@host\nssh -i ~\u002F.ssh\u002Fid_rsa user@host\n\nssh-keygen -t ed25519 -C \"comment\"\nssh-copy-id user@host\n\nssh -L 8080:localhost:80 user@host   # 本地转发\nssh -R 8080:localhost:80 user@host   # 远程转发\nssh -D 1080 user@host                # SOCKS 代理\n",[29,5965,5966,5974,5985,5996,6000,6016,6023,6027,6042,6055],{"__ignoreMap":27},[32,5967,5968,5971],{"class":34,"line":35},[32,5969,5970],{"class":45},"ssh",[32,5972,5973],{"class":49}," user@host\n",[32,5975,5976,5978,5980,5983],{"class":34,"line":42},[32,5977,5970],{"class":45},[32,5979,1494],{"class":53},[32,5981,5982],{"class":53}," 2222",[32,5984,5973],{"class":49},[32,5986,5987,5989,5991,5994],{"class":34,"line":63},[32,5988,5970],{"class":45},[32,5990,704],{"class":53},[32,5992,5993],{"class":49}," ~\u002F.ssh\u002Fid_rsa",[32,5995,5973],{"class":49},[32,5997,5998],{"class":34,"line":78},[32,5999,82],{"emptyLinePlaceholder":81},[32,6001,6002,6005,6008,6011,6013],{"class":34,"line":85},[32,6003,6004],{"class":45},"ssh-keygen",[32,6006,6007],{"class":53}," -t",[32,6009,6010],{"class":49}," ed25519",[32,6012,5341],{"class":53},[32,6014,6015],{"class":49}," \"comment\"\n",[32,6017,6018,6021],{"class":34,"line":91},[32,6019,6020],{"class":45},"ssh-copy-id",[32,6022,5973],{"class":49},[32,6024,6025],{"class":34,"line":106},[32,6026,82],{"emptyLinePlaceholder":81},[32,6028,6029,6031,6033,6036,6039],{"class":34,"line":111},[32,6030,5970],{"class":45},[32,6032,5059],{"class":53},[32,6034,6035],{"class":49}," 8080:localhost:80",[32,6037,6038],{"class":49}," user@host",[32,6040,6041],{"class":38},"   # 本地转发\n",[32,6043,6044,6046,6048,6050,6052],{"class":34,"line":117},[32,6045,5970],{"class":45},[32,6047,4163],{"class":53},[32,6049,6035],{"class":49},[32,6051,6038],{"class":49},[32,6053,6054],{"class":38},"   # 远程转发\n",[32,6056,6057,6059,6061,6064,6066],{"class":34,"line":132},[32,6058,5970],{"class":45},[32,6060,587],{"class":53},[32,6062,6063],{"class":53}," 1080",[32,6065,6038],{"class":49},[32,6067,6068],{"class":38},"                # SOCKS 代理\n",[13,6070,6071,2443],{},[29,6072,6073],{},"~\u002F.ssh\u002Fconfig",[22,6075,6078],{"className":6076,"code":6077,"language":1921},[1919],"Host myserver\n    HostName 1.2.3.4\n    User alice\n    Port 2222\n    IdentityFile ~\u002F.ssh\u002Fid_ed25519\n",[29,6079,6077],{"__ignoreMap":27},[13,6081,6082,6083,1820],{},"之后 ",[29,6084,6085],{},"ssh myserver",[369,6087,6088],{"id":6088},"传输",[22,6090,6092],{"className":24,"code":6091,"language":26,"meta":27,"style":27},"scp \u003Cfile> user@host:\u002Fpath\u002F\nscp user@host:\u002Fpath\u002F\u003Cfile> .\nscp -r \u003Cdir> user@host:\u002Fpath\u002F\n\nrsync -avz --progress \u003Csrc> user@host:\u003Cdst>   # 增量同步\nrsync -avz --delete \u003Csrc> user@host:\u003Cdst>\n",[29,6093,6094,6110,6127,6143,6147,6180],{"__ignoreMap":27},[32,6095,6096,6099,6101,6103,6105,6107],{"class":34,"line":35},[32,6097,6098],{"class":45},"scp",[32,6100,280],{"class":279},[32,6102,283],{"class":49},[32,6104,287],{"class":286},[32,6106,290],{"class":279},[32,6108,6109],{"class":49}," user@host:\u002Fpath\u002F\n",[32,6111,6112,6114,6117,6119,6121,6123,6125],{"class":34,"line":42},[32,6113,6098],{"class":45},[32,6115,6116],{"class":49}," user@host:\u002Fpath\u002F",[32,6118,430],{"class":279},[32,6120,283],{"class":49},[32,6122,287],{"class":286},[32,6124,290],{"class":279},[32,6126,1882],{"class":49},[32,6128,6129,6131,6133,6135,6137,6139,6141],{"class":34,"line":63},[32,6130,6098],{"class":45},[32,6132,1876],{"class":53},[32,6134,280],{"class":279},[32,6136,3376],{"class":49},[32,6138,3379],{"class":286},[32,6140,290],{"class":279},[32,6142,6109],{"class":49},[32,6144,6145],{"class":34,"line":78},[32,6146,82],{"emptyLinePlaceholder":81},[32,6148,6149,6152,6155,6158,6160,6162,6164,6166,6169,6171,6173,6175,6177],{"class":34,"line":85},[32,6150,6151],{"class":45},"rsync",[32,6153,6154],{"class":53}," -avz",[32,6156,6157],{"class":53}," --progress",[32,6159,280],{"class":279},[32,6161,3396],{"class":49},[32,6163,3399],{"class":286},[32,6165,290],{"class":279},[32,6167,6168],{"class":49}," user@host:",[32,6170,430],{"class":279},[32,6172,3406],{"class":49},[32,6174,1583],{"class":286},[32,6176,290],{"class":279},[32,6178,6179],{"class":38},"   # 增量同步\n",[32,6181,6182,6184,6186,6189,6191,6193,6195,6197,6199,6201,6203,6205],{"class":34,"line":91},[32,6183,6151],{"class":45},[32,6185,6154],{"class":53},[32,6187,6188],{"class":53}," --delete",[32,6190,280],{"class":279},[32,6192,3396],{"class":49},[32,6194,3399],{"class":286},[32,6196,290],{"class":279},[32,6198,6168],{"class":49},[32,6200,430],{"class":279},[32,6202,3406],{"class":49},[32,6204,1583],{"class":286},[32,6206,1000],{"class":279},[17,6208,6210],{"id":6209},"十二软件包管理","十二、软件包管理",[369,6212,6214],{"id":6213},"aptdebian-ubuntu","apt（Debian \u002F Ubuntu）",[22,6216,6218],{"className":24,"code":6217,"language":26,"meta":27,"style":27},"sudo apt update                   # 更新索引\nsudo apt upgrade                  # 升级\nsudo apt full-upgrade             # 含依赖变化\nsudo apt install \u003Cpkg>\nsudo apt remove \u003Cpkg>             # 保留配置\nsudo apt purge \u003Cpkg>              # 含配置\nsudo apt autoremove               # 清理无用依赖\nsudo apt search \u003Ckw>\nsudo apt show \u003Cpkg>\napt list --installed\n\nsudo dpkg -i \u003Cpkg>.deb\ndpkg -l | grep \u003Cpkg>\n",[29,6219,6220,6232,6244,6256,6272,6291,6311,6323,6340,6356,6366,6370,6390],{"__ignoreMap":27},[32,6221,6222,6224,6226,6229],{"class":34,"line":35},[32,6223,2386],{"class":45},[32,6225,2430],{"class":49},[32,6227,6228],{"class":49}," update",[32,6230,6231],{"class":38},"                   # 更新索引\n",[32,6233,6234,6236,6238,6241],{"class":34,"line":42},[32,6235,2386],{"class":45},[32,6237,2430],{"class":49},[32,6239,6240],{"class":49}," upgrade",[32,6242,6243],{"class":38},"                  # 升级\n",[32,6245,6246,6248,6250,6253],{"class":34,"line":63},[32,6247,2386],{"class":45},[32,6249,2430],{"class":49},[32,6251,6252],{"class":49}," full-upgrade",[32,6254,6255],{"class":38},"             # 含依赖变化\n",[32,6257,6258,6260,6262,6264,6266,6268,6270],{"class":34,"line":78},[32,6259,2386],{"class":45},[32,6261,2430],{"class":49},[32,6263,2945],{"class":49},[32,6265,280],{"class":279},[32,6267,2950],{"class":49},[32,6269,2953],{"class":286},[32,6271,1000],{"class":279},[32,6273,6274,6276,6278,6280,6282,6284,6286,6288],{"class":34,"line":85},[32,6275,2386],{"class":45},[32,6277,2430],{"class":49},[32,6279,1234],{"class":49},[32,6281,280],{"class":279},[32,6283,2950],{"class":49},[32,6285,2953],{"class":286},[32,6287,290],{"class":279},[32,6289,6290],{"class":38},"             # 保留配置\n",[32,6292,6293,6295,6297,6300,6302,6304,6306,6308],{"class":34,"line":91},[32,6294,2386],{"class":45},[32,6296,2430],{"class":49},[32,6298,6299],{"class":49}," purge",[32,6301,280],{"class":279},[32,6303,2950],{"class":49},[32,6305,2953],{"class":286},[32,6307,290],{"class":279},[32,6309,6310],{"class":38},"              # 含配置\n",[32,6312,6313,6315,6317,6320],{"class":34,"line":106},[32,6314,2386],{"class":45},[32,6316,2430],{"class":49},[32,6318,6319],{"class":49}," autoremove",[32,6321,6322],{"class":38},"               # 清理无用依赖\n",[32,6324,6325,6327,6329,6332,6334,6336,6338],{"class":34,"line":111},[32,6326,2386],{"class":45},[32,6328,2430],{"class":49},[32,6330,6331],{"class":49}," search",[32,6333,280],{"class":279},[32,6335,3462],{"class":49},[32,6337,624],{"class":286},[32,6339,1000],{"class":279},[32,6341,6342,6344,6346,6348,6350,6352,6354],{"class":34,"line":117},[32,6343,2386],{"class":45},[32,6345,2430],{"class":49},[32,6347,1575],{"class":49},[32,6349,280],{"class":279},[32,6351,2950],{"class":49},[32,6353,2953],{"class":286},[32,6355,1000],{"class":279},[32,6357,6358,6361,6363],{"class":34,"line":132},[32,6359,6360],{"class":45},"apt",[32,6362,1088],{"class":49},[32,6364,6365],{"class":53}," --installed\n",[32,6367,6368],{"class":34,"line":137},[32,6369,82],{"emptyLinePlaceholder":81},[32,6371,6372,6374,6377,6379,6381,6383,6385,6387],{"class":34,"line":143},[32,6373,2386],{"class":45},[32,6375,6376],{"class":49}," dpkg",[32,6378,704],{"class":53},[32,6380,280],{"class":279},[32,6382,2950],{"class":49},[32,6384,2953],{"class":286},[32,6386,290],{"class":279},[32,6388,6389],{"class":49},".deb\n",[32,6391,6392,6395,6397,6399,6401,6403,6405,6407],{"class":34,"line":158},[32,6393,6394],{"class":45},"dpkg",[32,6396,4027],{"class":53},[32,6398,3126],{"class":279},[32,6400,3129],{"class":45},[32,6402,280],{"class":279},[32,6404,2950],{"class":49},[32,6406,2953],{"class":286},[32,6408,1000],{"class":279},[369,6410,6412],{"id":6411},"yum-dnfrhel-centos","yum \u002F dnf（RHEL \u002F CentOS）",[22,6414,6416],{"className":24,"code":6415,"language":26,"meta":27,"style":27},"sudo yum install \u003Cpkg>\nsudo yum remove \u003Cpkg>\nsudo yum update\nsudo yum search \u003Ckw>\nsudo yum info \u003Cpkg>\nyum list installed\nyum clean all && yum makecache\n\nsudo dnf install \u003Cpkg>            # 新一代\ndnf upgrade\ndnf clean all\n\nsudo rpm -ivh \u003Cpkg>.rpm\nrpm -qa | grep \u003Cpkg>\nsudo rpm -e \u003Cpkg>\n",[29,6417,6418,6434,6450,6458,6474,6490,6500,6514,6518,6537,6545,6553,6557,6578,6598],{"__ignoreMap":27},[32,6419,6420,6422,6424,6426,6428,6430,6432],{"class":34,"line":35},[32,6421,2386],{"class":45},[32,6423,2635],{"class":49},[32,6425,2945],{"class":49},[32,6427,280],{"class":279},[32,6429,2950],{"class":49},[32,6431,2953],{"class":286},[32,6433,1000],{"class":279},[32,6435,6436,6438,6440,6442,6444,6446,6448],{"class":34,"line":42},[32,6437,2386],{"class":45},[32,6439,2635],{"class":49},[32,6441,1234],{"class":49},[32,6443,280],{"class":279},[32,6445,2950],{"class":49},[32,6447,2953],{"class":286},[32,6449,1000],{"class":279},[32,6451,6452,6454,6456],{"class":34,"line":63},[32,6453,2386],{"class":45},[32,6455,2635],{"class":49},[32,6457,2433],{"class":49},[32,6459,6460,6462,6464,6466,6468,6470,6472],{"class":34,"line":78},[32,6461,2386],{"class":45},[32,6463,2635],{"class":49},[32,6465,6331],{"class":49},[32,6467,280],{"class":279},[32,6469,3462],{"class":49},[32,6471,624],{"class":286},[32,6473,1000],{"class":279},[32,6475,6476,6478,6480,6482,6484,6486,6488],{"class":34,"line":85},[32,6477,2386],{"class":45},[32,6479,2635],{"class":49},[32,6481,3123],{"class":49},[32,6483,280],{"class":279},[32,6485,2950],{"class":49},[32,6487,2953],{"class":286},[32,6489,1000],{"class":279},[32,6491,6492,6495,6497],{"class":34,"line":91},[32,6493,6494],{"class":45},"yum",[32,6496,1088],{"class":49},[32,6498,6499],{"class":49}," installed\n",[32,6501,6502,6504,6506,6508,6510,6512],{"class":34,"line":106},[32,6503,6494],{"class":45},[32,6505,2638],{"class":49},[32,6507,2725],{"class":49},[32,6509,2728],{"class":286},[32,6511,6494],{"class":45},[32,6513,2650],{"class":49},[32,6515,6516],{"class":34,"line":111},[32,6517,82],{"emptyLinePlaceholder":81},[32,6519,6520,6522,6524,6526,6528,6530,6532,6534],{"class":34,"line":117},[32,6521,2386],{"class":45},[32,6523,2720],{"class":49},[32,6525,2945],{"class":49},[32,6527,280],{"class":279},[32,6529,2950],{"class":49},[32,6531,2953],{"class":286},[32,6533,290],{"class":279},[32,6535,6536],{"class":38},"            # 新一代\n",[32,6538,6539,6542],{"class":34,"line":132},[32,6540,6541],{"class":45},"dnf",[32,6543,6544],{"class":49}," upgrade\n",[32,6546,6547,6549,6551],{"class":34,"line":137},[32,6548,6541],{"class":45},[32,6550,2638],{"class":49},[32,6552,2641],{"class":49},[32,6554,6555],{"class":34,"line":143},[32,6556,82],{"emptyLinePlaceholder":81},[32,6558,6559,6561,6564,6567,6569,6571,6573,6575],{"class":34,"line":158},[32,6560,2386],{"class":45},[32,6562,6563],{"class":49}," rpm",[32,6565,6566],{"class":53}," -ivh",[32,6568,280],{"class":279},[32,6570,2950],{"class":49},[32,6572,2953],{"class":286},[32,6574,290],{"class":279},[32,6576,6577],{"class":49},".rpm\n",[32,6579,6580,6583,6586,6588,6590,6592,6594,6596],{"class":34,"line":163},[32,6581,6582],{"class":45},"rpm",[32,6584,6585],{"class":53}," -qa",[32,6587,3126],{"class":279},[32,6589,3129],{"class":45},[32,6591,280],{"class":279},[32,6593,2950],{"class":49},[32,6595,2953],{"class":286},[32,6597,1000],{"class":279},[32,6599,6600,6602,6604,6607,6609,6611,6613],{"class":34,"line":169},[32,6601,2386],{"class":45},[32,6603,6563],{"class":49},[32,6605,6606],{"class":53}," -e",[32,6608,280],{"class":279},[32,6610,2950],{"class":49},[32,6612,2953],{"class":286},[32,6614,1000],{"class":279},[369,6616,6618],{"id":6617},"pacmanarch","pacman（Arch）",[22,6620,6622],{"className":24,"code":6621,"language":26,"meta":27,"style":27},"sudo pacman -Syu                  # 同步并升级\nsudo pacman -S \u003Cpkg>\nsudo pacman -Rns \u003Cpkg>            # 卸载含依赖配置\npacman -Ss \u003Ckw>\npacman -Qs \u003Cpkg>\n",[29,6623,6624,6636,6652,6672,6688],{"__ignoreMap":27},[32,6625,6626,6628,6630,6633],{"class":34,"line":35},[32,6627,2386],{"class":45},[32,6629,2816],{"class":49},[32,6631,6632],{"class":53}," -Syu",[32,6634,6635],{"class":38},"                  # 同步并升级\n",[32,6637,6638,6640,6642,6644,6646,6648,6650],{"class":34,"line":42},[32,6639,2386],{"class":45},[32,6641,2816],{"class":49},[32,6643,1544],{"class":53},[32,6645,280],{"class":279},[32,6647,2950],{"class":49},[32,6649,2953],{"class":286},[32,6651,1000],{"class":279},[32,6653,6654,6656,6658,6661,6663,6665,6667,6669],{"class":34,"line":63},[32,6655,2386],{"class":45},[32,6657,2816],{"class":49},[32,6659,6660],{"class":53}," -Rns",[32,6662,280],{"class":279},[32,6664,2950],{"class":49},[32,6666,2953],{"class":286},[32,6668,290],{"class":279},[32,6670,6671],{"class":38},"            # 卸载含依赖配置\n",[32,6673,6674,6677,6680,6682,6684,6686],{"class":34,"line":78},[32,6675,6676],{"class":45},"pacman",[32,6678,6679],{"class":53}," -Ss",[32,6681,280],{"class":279},[32,6683,3462],{"class":49},[32,6685,624],{"class":286},[32,6687,1000],{"class":279},[32,6689,6690,6692,6695,6697,6699,6701],{"class":34,"line":85},[32,6691,6676],{"class":45},[32,6693,6694],{"class":53}," -Qs",[32,6696,280],{"class":279},[32,6698,2950],{"class":49},[32,6700,2953],{"class":286},[32,6702,1000],{"class":279},[17,6704,6706],{"id":6705},"十三日志","十三、日志",[22,6708,6710],{"className":24,"code":6709,"language":26,"meta":27,"style":27},"journalctl -xe\njournalctl --since today\njournalctl -p err                 # 只错误\n\ntail -f \u002Fvar\u002Flog\u002Fsyslog           # Debian\u002FUbuntu\ntail -f \u002Fvar\u002Flog\u002Fmessages         # RHEL\u002FCentOS\ntail -f \u002Fvar\u002Flog\u002Fauth.log         # 认证\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n\ndmesg\ndmesg -T                          # 人类可读时间\ndmesg | tail -20\n",[29,6711,6712,6719,6728,6740,6744,6756,6768,6780,6789,6798,6802,6807,6818],{"__ignoreMap":27},[32,6713,6714,6716],{"class":34,"line":35},[32,6715,5764],{"class":45},[32,6717,6718],{"class":53}," -xe\n",[32,6720,6721,6723,6725],{"class":34,"line":42},[32,6722,5764],{"class":45},[32,6724,5808],{"class":53},[32,6726,6727],{"class":49}," today\n",[32,6729,6730,6732,6734,6737],{"class":34,"line":63},[32,6731,5764],{"class":45},[32,6733,1494],{"class":53},[32,6735,6736],{"class":49}," err",[32,6738,6739],{"class":38},"                 # 只错误\n",[32,6741,6742],{"class":34,"line":78},[32,6743,82],{"emptyLinePlaceholder":81},[32,6745,6746,6748,6750,6753],{"class":34,"line":85},[32,6747,3707],{"class":45},[32,6749,3710],{"class":53},[32,6751,6752],{"class":49}," \u002Fvar\u002Flog\u002Fsyslog",[32,6754,6755],{"class":38},"           # Debian\u002FUbuntu\n",[32,6757,6758,6760,6762,6765],{"class":34,"line":91},[32,6759,3707],{"class":45},[32,6761,3710],{"class":53},[32,6763,6764],{"class":49}," \u002Fvar\u002Flog\u002Fmessages",[32,6766,6767],{"class":38},"         # RHEL\u002FCentOS\n",[32,6769,6770,6772,6774,6777],{"class":34,"line":106},[32,6771,3707],{"class":45},[32,6773,3710],{"class":53},[32,6775,6776],{"class":49}," \u002Fvar\u002Flog\u002Fauth.log",[32,6778,6779],{"class":38},"         # 认证\n",[32,6781,6782,6784,6786],{"class":34,"line":111},[32,6783,3707],{"class":45},[32,6785,3710],{"class":53},[32,6787,6788],{"class":49}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[32,6790,6791,6793,6795],{"class":34,"line":117},[32,6792,3707],{"class":45},[32,6794,3710],{"class":53},[32,6796,6797],{"class":49}," \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n",[32,6799,6800],{"class":34,"line":132},[32,6801,82],{"emptyLinePlaceholder":81},[32,6803,6804],{"class":34,"line":137},[32,6805,6806],{"class":45},"dmesg\n",[32,6808,6809,6812,6815],{"class":34,"line":143},[32,6810,6811],{"class":45},"dmesg",[32,6813,6814],{"class":53}," -T",[32,6816,6817],{"class":38},"                          # 人类可读时间\n",[32,6819,6820,6822,6824,6826],{"class":34,"line":158},[32,6821,6811],{"class":45},[32,6823,3126],{"class":279},[32,6825,3697],{"class":45},[32,6827,5275],{"class":53},[17,6829,6831],{"id":6830},"十四环境变量","十四、环境变量",[22,6833,6835],{"className":24,"code":6834,"language":26,"meta":27,"style":27},"env\necho $PATH\nexport FOO=bar\nunset FOO\n\n# 永久\n~\u002F.bashrc                         # bash 交互式\n~\u002F.bash_profile                   # bash 登录\n~\u002F.profile                        # 通用\n\u002Fetc\u002Fprofile                      # 全局\n\nsource ~\u002F.bashrc\n\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"      # 前置\nexport PATH=\"$PATH:\u002Fopt\u002Ftools\u002Fbin\"        # 后置\n",[29,6836,6837,6842,6850,6864,6872,6876,6880,6891,6901,6911,6919,6923,6931,6935,6961],{"__ignoreMap":27},[32,6838,6839],{"class":34,"line":35},[32,6840,6841],{"class":45},"env\n",[32,6843,6844,6847],{"class":34,"line":42},[32,6845,6846],{"class":3324},"echo",[32,6848,6849],{"class":286}," $PATH\n",[32,6851,6852,6855,6858,6861],{"class":34,"line":63},[32,6853,6854],{"class":279},"export",[32,6856,6857],{"class":286}," FOO",[32,6859,6860],{"class":279},"=",[32,6862,6863],{"class":286},"bar\n",[32,6865,6866,6869],{"class":34,"line":78},[32,6867,6868],{"class":3324},"unset",[32,6870,6871],{"class":49}," FOO\n",[32,6873,6874],{"class":34,"line":85},[32,6875,82],{"emptyLinePlaceholder":81},[32,6877,6878],{"class":34,"line":91},[32,6879,2875],{"class":38},[32,6881,6882,6885,6888],{"class":34,"line":106},[32,6883,6884],{"class":279},"~",[32,6886,6887],{"class":286},"\u002F.bashrc                         ",[32,6889,6890],{"class":38},"# bash 交互式\n",[32,6892,6893,6895,6898],{"class":34,"line":111},[32,6894,6884],{"class":279},[32,6896,6897],{"class":286},"\u002F.bash_profile                   ",[32,6899,6900],{"class":38},"# bash 登录\n",[32,6902,6903,6905,6908],{"class":34,"line":117},[32,6904,6884],{"class":279},[32,6906,6907],{"class":286},"\u002F.profile                        ",[32,6909,6910],{"class":38},"# 通用\n",[32,6912,6913,6916],{"class":34,"line":132},[32,6914,6915],{"class":45},"\u002Fetc\u002Fprofile",[32,6917,6918],{"class":38},"                      # 全局\n",[32,6920,6921],{"class":34,"line":137},[32,6922,82],{"emptyLinePlaceholder":81},[32,6924,6925,6928],{"class":34,"line":143},[32,6926,6927],{"class":3324},"source",[32,6929,6930],{"class":49}," ~\u002F.bashrc\n",[32,6932,6933],{"class":34,"line":158},[32,6934,82],{"emptyLinePlaceholder":81},[32,6936,6937,6939,6942,6944,6947,6950,6953,6956,6958],{"class":34,"line":163},[32,6938,6854],{"class":279},[32,6940,6941],{"class":286}," PATH",[32,6943,6860],{"class":279},[32,6945,6946],{"class":49},"\"",[32,6948,6949],{"class":286},"$HOME",[32,6951,6952],{"class":49},"\u002F.local\u002Fbin:",[32,6954,6955],{"class":286},"$PATH",[32,6957,6946],{"class":49},[32,6959,6960],{"class":38},"      # 前置\n",[32,6962,6963,6965,6967,6969,6971,6973,6976],{"class":34,"line":169},[32,6964,6854],{"class":279},[32,6966,6941],{"class":286},[32,6968,6860],{"class":279},[32,6970,6946],{"class":49},[32,6972,6955],{"class":286},[32,6974,6975],{"class":49},":\u002Fopt\u002Ftools\u002Fbin\"",[32,6977,6978],{"class":38},"        # 后置\n",[17,6980,6982],{"id":6981},"十五性能排查","十五、性能排查",[22,6984,6986],{"className":24,"code":6985,"language":26,"meta":27,"style":27},"uptime                            # 负载\ntop                               # 实时\nfree -h                           # 内存\ndf -h \u002F df -i                     # 磁盘 \u002F inode\niostat -x 1                       # IO\nsar -u 1 5                        # CPU 历史\n",[29,6987,6988,6996,7003,7011,7027,7038],{"__ignoreMap":27},[32,6989,6990,6993],{"class":34,"line":35},[32,6991,6992],{"class":45},"uptime",[32,6994,6995],{"class":38},"                            # 负载\n",[32,6997,6998,7000],{"class":34,"line":42},[32,6999,4418],{"class":45},[32,7001,7002],{"class":38},"                               # 实时\n",[32,7004,7005,7007,7009],{"class":34,"line":63},[32,7006,5162],{"class":45},[32,7008,5107],{"class":53},[32,7010,5167],{"class":38},[32,7012,7013,7015,7017,7019,7022,7024],{"class":34,"line":78},[32,7014,5104],{"class":45},[32,7016,5107],{"class":53},[32,7018,3678],{"class":49},[32,7020,7021],{"class":49}," df",[32,7023,704],{"class":53},[32,7025,7026],{"class":38},"                     # 磁盘 \u002F inode\n",[32,7028,7029,7031,7033,7035],{"class":34,"line":85},[32,7030,5180],{"class":45},[32,7032,5183],{"class":53},[32,7034,5186],{"class":53},[32,7036,7037],{"class":38},"                       # IO\n",[32,7039,7040,7043,7045,7047,7049],{"class":34,"line":91},[32,7041,7042],{"class":45},"sar",[32,7044,1076],{"class":53},[32,7046,5186],{"class":53},[32,7048,2840],{"class":53},[32,7050,7051],{"class":38},"                        # CPU 历史\n",[13,7053,7054],{},"通用排查顺序：",[611,7056,7057,7065,7071,7080,7086],{},[2288,7058,7059,7061,7062,7064],{},[29,7060,6992],{}," + ",[29,7063,4418],{},"：负载高不高、哪个进程占用。",[2288,7066,7067,7070],{},[29,7068,7069],{},"free -h","：内存是否耗尽、是否 swap。",[2288,7072,7073,7061,7076,7079],{},[29,7074,7075],{},"df -h",[29,7077,7078],{},"df -i","：空间 \u002F inode 是否满。",[2288,7081,7082,7085],{},[29,7083,7084],{},"iostat -x 1","：IO 是否瓶颈。",[2288,7087,7088,7091],{},[29,7089,7090],{},"ss -s","：连接数是否异常。",[369,7093,7094],{"id":7094},"定位细节",[22,7096,7098],{"className":24,"code":7097,"language":26,"meta":27,"style":27},"lsof -p \u003Cpid>                     # 进程打开的文件\nlsof -i :8080                     # 端口占用\nlsof \u002Fvar\u002Flog\u002Fsyslog\n\ntop -H -p \u003Cpid>                   # 线程\nps -T -p \u003Cpid>\n\ntcpdump -i eth0 -n\ntcpdump -i eth0 port 80\ntcpdump -i eth0 host 1.2.3.4\ntcpdump -i eth0 -w cap.pcap       # 存盘（Wireshark 打开）\n",[29,7099,7100,7117,7128,7135,7139,7158,7174,7178,7191,7204,7218],{"__ignoreMap":27},[32,7101,7102,7104,7106,7108,7110,7112,7114],{"class":34,"line":35},[32,7103,4674],{"class":45},[32,7105,1494],{"class":53},[32,7107,280],{"class":279},[32,7109,4443],{"class":49},[32,7111,614],{"class":286},[32,7113,290],{"class":279},[32,7115,7116],{"class":38},"                     # 进程打开的文件\n",[32,7118,7119,7121,7123,7125],{"class":34,"line":42},[32,7120,4674],{"class":45},[32,7122,704],{"class":53},[32,7124,4679],{"class":49},[32,7126,7127],{"class":38},"                     # 端口占用\n",[32,7129,7130,7132],{"class":34,"line":63},[32,7131,4674],{"class":45},[32,7133,7134],{"class":49}," \u002Fvar\u002Flog\u002Fsyslog\n",[32,7136,7137],{"class":34,"line":78},[32,7138,82],{"emptyLinePlaceholder":81},[32,7140,7141,7143,7145,7147,7149,7151,7153,7155],{"class":34,"line":85},[32,7142,4418],{"class":45},[32,7144,4825],{"class":53},[32,7146,1494],{"class":53},[32,7148,280],{"class":279},[32,7150,4443],{"class":49},[32,7152,614],{"class":286},[32,7154,290],{"class":279},[32,7156,7157],{"class":38},"                   # 线程\n",[32,7159,7160,7162,7164,7166,7168,7170,7172],{"class":34,"line":91},[32,7161,4369],{"class":45},[32,7163,6814],{"class":53},[32,7165,1494],{"class":53},[32,7167,280],{"class":279},[32,7169,4443],{"class":49},[32,7171,614],{"class":286},[32,7173,1000],{"class":279},[32,7175,7176],{"class":34,"line":106},[32,7177,82],{"emptyLinePlaceholder":81},[32,7179,7180,7183,7185,7188],{"class":34,"line":111},[32,7181,7182],{"class":45},"tcpdump",[32,7184,704],{"class":53},[32,7186,7187],{"class":49}," eth0",[32,7189,7190],{"class":53}," -n\n",[32,7192,7193,7195,7197,7199,7202],{"class":34,"line":117},[32,7194,7182],{"class":45},[32,7196,704],{"class":53},[32,7198,7187],{"class":49},[32,7200,7201],{"class":49}," port",[32,7203,5001],{"class":53},[32,7205,7206,7208,7210,7212,7215],{"class":34,"line":132},[32,7207,7182],{"class":45},[32,7209,704],{"class":53},[32,7211,7187],{"class":49},[32,7213,7214],{"class":49}," host",[32,7216,7217],{"class":53}," 1.2.3.4\n",[32,7219,7220,7222,7224,7226,7228,7231],{"class":34,"line":137},[32,7221,7182],{"class":45},[32,7223,704],{"class":53},[32,7225,7187],{"class":49},[32,7227,3161],{"class":53},[32,7229,7230],{"class":49}," cap.pcap",[32,7232,7233],{"class":38},"       # 存盘（Wireshark 打开）\n",[17,7235,7237],{"id":7236},"十六定时任务","十六、定时任务",[22,7239,7241],{"className":24,"code":7240,"language":26,"meta":27,"style":27},"crontab -e                        # 编辑\ncrontab -l                        # 列出\ncrontab -r                        # 删除\n",[29,7242,7243,7253,7262],{"__ignoreMap":27},[32,7244,7245,7248,7250],{"class":34,"line":35},[32,7246,7247],{"class":45},"crontab",[32,7249,6606],{"class":53},[32,7251,7252],{"class":38},"                        # 编辑\n",[32,7254,7255,7257,7259],{"class":34,"line":42},[32,7256,7247],{"class":45},[32,7258,4027],{"class":53},[32,7260,7261],{"class":38},"                        # 列出\n",[32,7263,7264,7266,7268],{"class":34,"line":63},[32,7265,7247],{"class":45},[32,7267,1876],{"class":53},[32,7269,7270],{"class":38},"                        # 删除\n",[13,7272,7273],{},"格式：",[22,7275,7278],{"className":7276,"code":7277,"language":1921},[1919],"* * * * * \u003Ccommand>\n│ │ │ │ │\n│ │ │ │ └─ 星期（0-7，0\u002F7 都是周日）\n│ │ │ └─── 月（1-12）\n│ │ └───── 日（1-31）\n│ └─────── 时（0-23）\n└───────── 分（0-59）\n",[29,7279,7277],{"__ignoreMap":27},[13,7281,4279],{},[22,7283,7286],{"className":7284,"code":7285,"language":1921},[1919],"0 3 * * * \u002Fopt\u002Fbackup.sh              # 每天 3:00\n*\u002F5 * * * * \u002Fusr\u002Fbin\u002Fcheck.sh         # 每 5 分钟\n0 9-18 * * 1-5 \u002Fopt\u002Fwork.sh           # 工作日 9-18 整点\n",[29,7287,7285],{"__ignoreMap":27},[13,7289,7290],{},"注意事项：",[2285,7292,7293,7296,7302],{},[2288,7294,7295],{},"PATH 与登录 shell 不同，用绝对路径。",[2288,7297,7298,7299,1911],{},"输出默认发邮件，重定向：",[29,7300,7301],{},">> \u002Fvar\u002Flog\u002Fjob.log 2>&1",[2288,7303,7304],{},"秒级任务用 systemd timer。",[17,7306,7308],{"id":7307},"十七实用技巧","十七、实用技巧",[22,7310,7312],{"className":24,"code":7311,"language":26,"meta":27,"style":27},"history\nhistory | grep \u003Ckw>\nCtrl+R                            # 反向搜索历史\n!!                                # 上一条\n!$                                # 上一条最后参数\n!123                              # 历史编号 123\n\npushd \u002Fpath \u002F popd \u002F dirs -v\n\nnohup \u003Ccmd> > out.log 2>&1 &\ndisown\n\nopenssl rand -base64 16           # 随机密码\nuuidgen\nmd5sum \u003Cfile>\nsha256sum \u003Cfile>\nxxd \u003Cfile>\ntime \u003Ccmd>\n\npython3 -m http.server 8000       # 快速 HTTP 服务\n",[29,7313,7314,7319,7336,7344,7352,7363,7373,7377,7382,7386,7411,7416,7420,7437,7442,7455,7468,7481,7493,7497],{"__ignoreMap":27},[32,7315,7316],{"class":34,"line":35},[32,7317,7318],{"class":3324},"history\n",[32,7320,7321,7324,7326,7328,7330,7332,7334],{"class":34,"line":42},[32,7322,7323],{"class":3324},"history",[32,7325,3126],{"class":279},[32,7327,3129],{"class":45},[32,7329,280],{"class":279},[32,7331,3462],{"class":49},[32,7333,624],{"class":286},[32,7335,1000],{"class":279},[32,7337,7338,7341],{"class":34,"line":63},[32,7339,7340],{"class":45},"Ctrl+R",[32,7342,7343],{"class":38},"                            # 反向搜索历史\n",[32,7345,7346,7349],{"class":34,"line":78},[32,7347,7348],{"class":279},"!!",[32,7350,7351],{"class":38},"                                # 上一条\n",[32,7353,7354,7357,7360],{"class":34,"line":85},[32,7355,7356],{"class":279},"!",[32,7358,7359],{"class":45},"$",[32,7361,7362],{"class":38},"                                # 上一条最后参数\n",[32,7364,7365,7367,7370],{"class":34,"line":91},[32,7366,7356],{"class":279},[32,7368,7369],{"class":45},"123",[32,7371,7372],{"class":38},"                              # 历史编号 123\n",[32,7374,7375],{"class":34,"line":106},[32,7376,82],{"emptyLinePlaceholder":81},[32,7378,7379],{"class":34,"line":111},[32,7380,7381],{"class":286},"pushd \u002Fpath \u002F popd \u002F dirs -v\n",[32,7383,7384],{"class":34,"line":117},[32,7385,82],{"emptyLinePlaceholder":81},[32,7387,7388,7391,7393,7395,7397,7399,7402,7405,7408],{"class":34,"line":132},[32,7389,7390],{"class":45},"nohup",[32,7392,280],{"class":279},[32,7394,3625],{"class":49},[32,7396,614],{"class":286},[32,7398,290],{"class":279},[32,7400,7401],{"class":279}," >",[32,7403,7404],{"class":49}," out.log",[32,7406,7407],{"class":279}," 2>&1",[32,7409,7410],{"class":286}," &\n",[32,7412,7413],{"class":34,"line":137},[32,7414,7415],{"class":3324},"disown\n",[32,7417,7418],{"class":34,"line":143},[32,7419,82],{"emptyLinePlaceholder":81},[32,7421,7422,7425,7428,7431,7434],{"class":34,"line":158},[32,7423,7424],{"class":45},"openssl",[32,7426,7427],{"class":49}," rand",[32,7429,7430],{"class":53}," -base64",[32,7432,7433],{"class":53}," 16",[32,7435,7436],{"class":38},"           # 随机密码\n",[32,7438,7439],{"class":34,"line":163},[32,7440,7441],{"class":45},"uuidgen\n",[32,7443,7444,7447,7449,7451,7453],{"class":34,"line":169},[32,7445,7446],{"class":45},"md5sum",[32,7448,280],{"class":279},[32,7450,283],{"class":49},[32,7452,287],{"class":286},[32,7454,1000],{"class":279},[32,7456,7457,7460,7462,7464,7466],{"class":34,"line":184},[32,7458,7459],{"class":45},"sha256sum",[32,7461,280],{"class":279},[32,7463,283],{"class":49},[32,7465,287],{"class":286},[32,7467,1000],{"class":279},[32,7469,7470,7473,7475,7477,7479],{"class":34,"line":199},[32,7471,7472],{"class":45},"xxd",[32,7474,280],{"class":279},[32,7476,283],{"class":49},[32,7478,287],{"class":286},[32,7480,1000],{"class":279},[32,7482,7483,7486,7488,7491],{"class":34,"line":214},[32,7484,7485],{"class":279},"time",[32,7487,280],{"class":279},[32,7489,7490],{"class":286},"cmd",[32,7492,1000],{"class":279},[32,7494,7495],{"class":34,"line":229},[32,7496,82],{"emptyLinePlaceholder":81},[32,7498,7499,7502,7504,7507,7510],{"class":34,"line":234},[32,7500,7501],{"class":45},"python3",[32,7503,327],{"class":53},[32,7505,7506],{"class":49}," http.server",[32,7508,7509],{"class":53}," 8000",[32,7511,7512],{"class":38},"       # 快速 HTTP 服务\n",[369,7514,7515],{"id":7515},"命令组合",[22,7517,7519],{"className":24,"code":7518,"language":26,"meta":27,"style":27},"cmd1 && cmd2                      # 成功才继续\ncmd1 || cmd2                      # 失败才继续\ncmd1 ; cmd2                       # 顺序\ncmd1 &                            # 后台\n(cmd1; cmd2)                      # 子 shell\n",[29,7520,7521,7534,7547,7559,7569],{"__ignoreMap":27},[32,7522,7523,7526,7528,7531],{"class":34,"line":35},[32,7524,7525],{"class":45},"cmd1",[32,7527,2728],{"class":286},[32,7529,7530],{"class":45},"cmd2",[32,7532,7533],{"class":38},"                      # 成功才继续\n",[32,7535,7536,7538,7541,7544],{"class":34,"line":42},[32,7537,7525],{"class":45},[32,7539,7540],{"class":279}," ||",[32,7542,7543],{"class":45}," cmd2",[32,7545,7546],{"class":38},"                      # 失败才继续\n",[32,7548,7549,7551,7554,7556],{"class":34,"line":63},[32,7550,7525],{"class":45},[32,7552,7553],{"class":286}," ; ",[32,7555,7530],{"class":45},[32,7557,7558],{"class":38},"                       # 顺序\n",[32,7560,7561,7563,7566],{"class":34,"line":78},[32,7562,7525],{"class":45},[32,7564,7565],{"class":286}," &                            ",[32,7567,7568],{"class":38},"# 后台\n",[32,7570,7571,7574,7576,7579,7581,7584],{"class":34,"line":85},[32,7572,7573],{"class":286},"(",[32,7575,7525],{"class":45},[32,7577,7578],{"class":286},"; ",[32,7580,7530],{"class":45},[32,7582,7583],{"class":286},")                      ",[32,7585,7586],{"class":38},"# 子 shell\n",[369,7588,7589],{"id":7589},"变量",[22,7591,7593],{"className":24,"code":7592,"language":26,"meta":27,"style":27},"name=\"world\"\necho \"$name\"\necho \"${name}\"\necho \"$(date)\"\necho '$name'                      # 不替换\n\n: ${VAR:=default}                 # 默认值\n\nstr=\"hello.txt\"\n\n{% raw %}\necho ${str%.txt}                  # hello\necho ${str#hello.}                # txt\necho ${str\u002Ftxt\u002Fmd}                # hello.md\necho ${#str}                      # 9\n{% endraw %}\n\n",[29,7594,7595,7605,7618,7630,7643,7653,7657,7674,7678,7688,7692,7706,7721,7736,7755,7770],{"__ignoreMap":27},[32,7596,7597,7600,7602],{"class":34,"line":35},[32,7598,7599],{"class":286},"name",[32,7601,6860],{"class":279},[32,7603,7604],{"class":49},"\"world\"\n",[32,7606,7607,7609,7612,7615],{"class":34,"line":42},[32,7608,6846],{"class":3324},[32,7610,7611],{"class":49}," \"",[32,7613,7614],{"class":286},"$name",[32,7616,7617],{"class":49},"\"\n",[32,7619,7620,7622,7625,7627],{"class":34,"line":63},[32,7621,6846],{"class":3324},[32,7623,7624],{"class":49}," \"${",[32,7626,7599],{"class":286},[32,7628,7629],{"class":49},"}\"\n",[32,7631,7632,7634,7637,7640],{"class":34,"line":78},[32,7633,6846],{"class":3324},[32,7635,7636],{"class":49}," \"$(",[32,7638,7639],{"class":45},"date",[32,7641,7642],{"class":49},")\"\n",[32,7644,7645,7647,7650],{"class":34,"line":85},[32,7646,6846],{"class":3324},[32,7648,7649],{"class":49}," '$name'",[32,7651,7652],{"class":38},"                      # 不替换\n",[32,7654,7655],{"class":34,"line":91},[32,7656,82],{"emptyLinePlaceholder":81},[32,7658,7659,7662,7665,7668,7671],{"class":34,"line":106},[32,7660,7661],{"class":3324},":",[32,7663,7664],{"class":286}," ${VAR",[32,7666,7667],{"class":279},":=",[32,7669,7670],{"class":286},"default}                 ",[32,7672,7673],{"class":38},"# 默认值\n",[32,7675,7676],{"class":34,"line":111},[32,7677,82],{"emptyLinePlaceholder":81},[32,7679,7680,7683,7685],{"class":34,"line":117},[32,7681,7682],{"class":286},"str",[32,7684,6860],{"class":279},[32,7686,7687],{"class":49},"\"hello.txt\"\n",[32,7689,7690],{"class":34,"line":132},[32,7691,82],{"emptyLinePlaceholder":81},[32,7693,7694,7697,7700,7703],{"class":34,"line":137},[32,7695,7696],{"class":286},"{",[32,7698,7699],{"class":45},"%",[32,7701,7702],{"class":49}," raw",[32,7704,7705],{"class":49}," %}\n",[32,7707,7708,7710,7713,7715,7718],{"class":34,"line":143},[32,7709,6846],{"class":3324},[32,7711,7712],{"class":286}," ${str",[32,7714,7699],{"class":279},[32,7716,7717],{"class":286},".txt}                  ",[32,7719,7720],{"class":38},"# hello\n",[32,7722,7723,7725,7727,7730,7733],{"class":34,"line":158},[32,7724,6846],{"class":3324},[32,7726,7712],{"class":286},[32,7728,7729],{"class":279},"#",[32,7731,7732],{"class":286},"hello.}                ",[32,7734,7735],{"class":38},"# txt\n",[32,7737,7738,7740,7742,7744,7747,7749,7752],{"class":34,"line":163},[32,7739,6846],{"class":3324},[32,7741,7712],{"class":286},[32,7743,4103],{"class":279},[32,7745,7746],{"class":286},"txt",[32,7748,4103],{"class":279},[32,7750,7751],{"class":286},"md}                ",[32,7753,7754],{"class":38},"# hello.md\n",[32,7756,7757,7759,7762,7764,7767],{"class":34,"line":169},[32,7758,6846],{"class":3324},[32,7760,7761],{"class":286}," ${",[32,7763,7729],{"class":279},[32,7765,7766],{"class":286},"str}                      ",[32,7768,7769],{"class":38},"# 9\n",[32,7771,7772,7774,7776,7779],{"class":34,"line":184},[32,7773,7696],{"class":286},[32,7775,7699],{"class":45},[32,7777,7778],{"class":49}," endraw",[32,7780,7705],{"class":49},[17,7782,7784],{"id":7783},"十八快捷键","十八、快捷键",[729,7786,7787,7797],{},[732,7788,7789],{},[735,7790,7791,7794],{},[738,7792,7793],{},"快捷键",[738,7795,7796],{},"作用",[751,7798,7799,7808,7818,7828,7841,7854,7864,7873,7882],{},[735,7800,7801,7805],{},[756,7802,7803],{},[29,7804,4599],{},[756,7806,7807],{},"中断",[735,7809,7810,7815],{},[756,7811,7812],{},[29,7813,7814],{},"Ctrl+D",[756,7816,7817],{},"退出 shell",[735,7819,7820,7825],{},[756,7821,7822],{},[29,7823,7824],{},"Ctrl+L",[756,7826,7827],{},"清屏",[735,7829,7830,7838],{},[756,7831,7832,2261,7835],{},[29,7833,7834],{},"Ctrl+A",[29,7836,7837],{},"Ctrl+E",[756,7839,7840],{},"行首 \u002F 行尾",[735,7842,7843,7851],{},[756,7844,7845,2261,7848],{},[29,7846,7847],{},"Ctrl+U",[29,7849,7850],{},"Ctrl+K",[756,7852,7853],{},"删光标前 \u002F 后",[735,7855,7856,7861],{},[756,7857,7858],{},[29,7859,7860],{},"Ctrl+W",[756,7862,7863],{},"删前一个单词",[735,7865,7866,7870],{},[756,7867,7868],{},[29,7869,7340],{},[756,7871,7872],{},"搜索历史",[735,7874,7875,7879],{},[756,7876,7877],{},[29,7878,4540],{},[756,7880,7881],{},"挂起",[735,7883,7884,7892],{},[756,7885,7886,2261,7889],{},[29,7887,7888],{},"Tab",[29,7890,7891],{},"Tab Tab",[756,7893,7894],{},"补全 \u002F 列候选",[2279,7896],{},[17,7898,2283],{"id":2283},[2285,7900,7901,7908,7915,7922,7929,7935],{},[2288,7902,7903,7904],{},"清华镜像站：",[2292,7905,7906],{"href":7906,"rel":7907,"target":2299},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002F",[2296,2297,2298],[2288,7909,7910,7911],{},"中科大镜像站：",[2292,7912,7913],{"href":7913,"rel":7914,"target":2299},"https:\u002F\u002Fmirrors.ustc.edu.cn\u002F",[2296,2297,2298],[2288,7916,7917,7918],{},"阿里云镜像站：",[2292,7919,7920],{"href":7920,"rel":7921,"target":2299},"https:\u002F\u002Fdeveloper.aliyun.com\u002Fmirror\u002F",[2296,2297,2298],[2288,7923,7924,7925],{},"npmmirror：",[2292,7926,7927],{"href":7927,"rel":7928,"target":2299},"https:\u002F\u002Fnpmmirror.com\u002F",[2296,2297,2298],[2288,7930,7931,7932],{},"man 手册：",[29,7933,7934],{},"man \u003Ccommand>",[2288,7936,7937,7938,7941],{},"tldr：",[29,7939,7940],{},"tldr \u003Ccommand>","（需安装）",[1977,7943,7944],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .szGx7, html code.shiki .szGx7{--shiki-default:#FD971F}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}",{"title":27,"searchDepth":42,"depth":42,"links":7946},[7947,7958,7961,7964,7965,7966,7969,7970,7971,7972,7973,7976,7981,7982,7983,7986,7987,7991,7992],{"id":2368,"depth":42,"text":2369,"children":7948},[7949,7950,7951,7952,7953,7954,7955,7956,7957],{"id":2372,"depth":63,"text":2373},{"id":2479,"depth":63,"text":2480},{"id":2547,"depth":63,"text":2548},{"id":2787,"depth":63,"text":2788},{"id":2864,"depth":63,"text":2865},{"id":3023,"depth":63,"text":3024},{"id":3144,"depth":63,"text":3145},{"id":3178,"depth":63,"text":3179},{"id":3229,"depth":63,"text":3230},{"id":3313,"depth":42,"text":3314,"children":7959},[7960],{"id":3509,"depth":63,"text":3509},{"id":3664,"depth":42,"text":3665,"children":7962},[7963],{"id":4049,"depth":63,"text":4049},{"id":4119,"depth":42,"text":4120},{"id":4358,"depth":42,"text":4359},{"id":4624,"depth":42,"text":4625,"children":7967},[7968],{"id":4953,"depth":63,"text":4953},{"id":5093,"depth":42,"text":5094},{"id":5278,"depth":42,"text":5279},{"id":5466,"depth":42,"text":5467},{"id":5683,"depth":42,"text":5684},{"id":5959,"depth":42,"text":5960,"children":7974},[7975],{"id":6088,"depth":63,"text":6088},{"id":6209,"depth":42,"text":6210,"children":7977},[7978,7979,7980],{"id":6213,"depth":63,"text":6214},{"id":6411,"depth":63,"text":6412},{"id":6617,"depth":63,"text":6618},{"id":6705,"depth":42,"text":6706},{"id":6830,"depth":42,"text":6831},{"id":6981,"depth":42,"text":6982,"children":7984},[7985],{"id":7094,"depth":63,"text":7094},{"id":7236,"depth":42,"text":7237},{"id":7307,"depth":42,"text":7308,"children":7988},[7989,7990],{"id":7515,"depth":63,"text":7515},{"id":7589,"depth":63,"text":7589},{"id":7783,"depth":42,"text":7784},{"id":2283,"depth":42,"text":2283},{},"\u002Flinux-memo-2026-09-25",{"title":2360,"description":2365},"linux-memo-2026-09-25",[7998,7999,2356],"linux","运维","iSEC1Y6u5VxuDGnkptYIp294v_f2HDDTd_aIwN64dAg",{"id":8002,"title":8003,"author":8,"body":8004,"cover":3,"date":2348,"description":8008,"extension":2349,"meta":10873,"navigation":81,"path":10874,"seo":10875,"stem":10876,"tags":10877,"__hash__":10879},"content\u002Fnode-package-managers-memo-2026-09-25.md","Node包管理器备忘录",{"type":10,"value":8005,"toc":10811},[8006,8009,8011,8015,8118,8122,8245,8249,8310,8322,8326,8372,8376,8382,8412,8418,8422,8425,8453,8463,8467,8487,8490,8522,8526,8604,8608,8619,8623,8628,8653,8664,8669,8685,8689,8719,8723,8753,8757,8776,8783,8787,8826,8830,8847,8851,8910,8914,9224,9228,9280,9286,9289,9368,9372,9404,9417,9421,9494,9498,9501,9579,9582,9656,9660,9664,9669,9726,9730,9774,9778,9823,9826,9894,9898,10053,10057,10060,10099,10140,10143,10180,10185,10189,10192,10212,10215,10333,10336,10363,10422,10426,10451,10455,10463,10466,10488,10496,10502,10548,10556,10584,10588,10591,10616,10619,10623,10629,10641,10645,10664,10668,10702,10710,10716,10749,10753,10776,10778,10780,10808],[13,8007,8008],{},"日常高频命令 + 国内换源方案。命令对照无差异时只写 npm。",[17,8010,2369],{"id":2368},[369,8012,8014],{"id":8013},"_11-一键切换nrm","1.1 一键切换：nrm",[22,8016,8018],{"className":24,"code":8017,"language":26,"meta":27,"style":27},"npm install -g nrm\n\nnrm ls                            # 列出所有源\nnrm use taobao                    # 切到淘宝源\nnrm use npm                       # 切回官方\nnrm current                       # 查看当前\nnrm test                          # 测速\nnrm add company http:\u002F\u002Fnpm.company.com\u002F    # 加私有源\nnrm del company\n",[29,8019,8020,8033,8037,8048,8061,8073,8083,8093,8108],{"__ignoreMap":27},[32,8021,8022,8025,8027,8030],{"class":34,"line":35},[32,8023,8024],{"class":45},"npm",[32,8026,2945],{"class":49},[32,8028,8029],{"class":53}," -g",[32,8031,8032],{"class":49}," nrm\n",[32,8034,8035],{"class":34,"line":42},[32,8036,82],{"emptyLinePlaceholder":81},[32,8038,8039,8042,8045],{"class":34,"line":63},[32,8040,8041],{"class":45},"nrm",[32,8043,8044],{"class":49}," ls",[32,8046,8047],{"class":38},"                            # 列出所有源\n",[32,8049,8050,8052,8055,8058],{"class":34,"line":78},[32,8051,8041],{"class":45},[32,8053,8054],{"class":49}," use",[32,8056,8057],{"class":49}," taobao",[32,8059,8060],{"class":38},"                    # 切到淘宝源\n",[32,8062,8063,8065,8067,8070],{"class":34,"line":85},[32,8064,8041],{"class":45},[32,8066,8054],{"class":49},[32,8068,8069],{"class":49}," npm",[32,8071,8072],{"class":38},"                       # 切回官方\n",[32,8074,8075,8077,8080],{"class":34,"line":91},[32,8076,8041],{"class":45},[32,8078,8079],{"class":49}," current",[32,8081,8082],{"class":38},"                       # 查看当前\n",[32,8084,8085,8087,8090],{"class":34,"line":106},[32,8086,8041],{"class":45},[32,8088,8089],{"class":49}," test",[32,8091,8092],{"class":38},"                          # 测速\n",[32,8094,8095,8097,8099,8102,8105],{"class":34,"line":111},[32,8096,8041],{"class":45},[32,8098,276],{"class":49},[32,8100,8101],{"class":49}," company",[32,8103,8104],{"class":49}," http:\u002F\u002Fnpm.company.com\u002F",[32,8106,8107],{"class":38},"    # 加私有源\n",[32,8109,8110,8112,8115],{"class":34,"line":117},[32,8111,8041],{"class":45},[32,8113,8114],{"class":49}," del",[32,8116,8117],{"class":49}," company\n",[369,8119,8121],{"id":8120},"_12-手动切换","1.2 手动切换",[22,8123,8125],{"className":24,"code":8124,"language":26,"meta":27,"style":27},"# npm\nnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\nnpm config get registry\nnpm config delete registry        # 恢复默认\n\n# yarn v1\nyarn config set registry https:\u002F\u002Fregistry.npmmirror.com\nyarn config get registry\nyarn config delete registry\n\n# pnpm\npnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\npnpm config get registry\n",[29,8126,8127,8132,8146,8158,8171,8175,8180,8193,8203,8213,8217,8222,8235],{"__ignoreMap":27},[32,8128,8129],{"class":34,"line":35},[32,8130,8131],{"class":38},"# npm\n",[32,8133,8134,8136,8138,8140,8143],{"class":34,"line":42},[32,8135,8024],{"class":45},[32,8137,50],{"class":49},[32,8139,2885],{"class":49},[32,8141,8142],{"class":49}," registry",[32,8144,8145],{"class":49}," https:\u002F\u002Fregistry.npmmirror.com\n",[32,8147,8148,8150,8152,8155],{"class":34,"line":63},[32,8149,8024],{"class":45},[32,8151,50],{"class":49},[32,8153,8154],{"class":49}," get",[32,8156,8157],{"class":49}," registry\n",[32,8159,8160,8162,8164,8166,8168],{"class":34,"line":78},[32,8161,8024],{"class":45},[32,8163,50],{"class":49},[32,8165,4996],{"class":49},[32,8167,8142],{"class":49},[32,8169,8170],{"class":38},"        # 恢复默认\n",[32,8172,8173],{"class":34,"line":85},[32,8174,82],{"emptyLinePlaceholder":81},[32,8176,8177],{"class":34,"line":91},[32,8178,8179],{"class":38},"# yarn v1\n",[32,8181,8182,8185,8187,8189,8191],{"class":34,"line":106},[32,8183,8184],{"class":45},"yarn",[32,8186,50],{"class":49},[32,8188,2885],{"class":49},[32,8190,8142],{"class":49},[32,8192,8145],{"class":49},[32,8194,8195,8197,8199,8201],{"class":34,"line":111},[32,8196,8184],{"class":45},[32,8198,50],{"class":49},[32,8200,8154],{"class":49},[32,8202,8157],{"class":49},[32,8204,8205,8207,8209,8211],{"class":34,"line":117},[32,8206,8184],{"class":45},[32,8208,50],{"class":49},[32,8210,4996],{"class":49},[32,8212,8157],{"class":49},[32,8214,8215],{"class":34,"line":132},[32,8216,82],{"emptyLinePlaceholder":81},[32,8218,8219],{"class":34,"line":137},[32,8220,8221],{"class":38},"# pnpm\n",[32,8223,8224,8227,8229,8231,8233],{"class":34,"line":143},[32,8225,8226],{"class":45},"pnpm",[32,8228,50],{"class":49},[32,8230,2885],{"class":49},[32,8232,8142],{"class":49},[32,8234,8145],{"class":49},[32,8236,8237,8239,8241,8243],{"class":34,"line":158},[32,8238,8226],{"class":45},[32,8240,50],{"class":49},[32,8242,8154],{"class":49},[32,8244,8157],{"class":49},[369,8246,8248],{"id":8247},"_13-常用镜像源","1.3 常用镜像源",[729,8250,8251,8259],{},[732,8252,8253],{},[735,8254,8255,8257],{},[738,8256,2489],{},[738,8258,2492],{},[751,8260,8261,8271,8281,8291,8300],{},[735,8262,8263,8266],{},[756,8264,8265],{},"官方",[756,8267,8268],{},[29,8269,8270],{},"https:\u002F\u002Fregistry.npmjs.org",[735,8272,8273,8276],{},[756,8274,8275],{},"淘宝 \u002F npmmirror（推荐）",[756,8277,8278],{},[29,8279,8280],{},"https:\u002F\u002Fregistry.npmmirror.com",[735,8282,8283,8286],{},[756,8284,8285],{},"腾讯云",[756,8287,8288],{},[29,8289,8290],{},"https:\u002F\u002Fmirrors.cloud.tencent.com\u002Fnpm\u002F",[735,8292,8293,8295],{},[756,8294,2529],{},[756,8296,8297],{},[29,8298,8299],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fnpm\u002F",[735,8301,8302,8305],{},[756,8303,8304],{},"cnpmjs",[756,8306,8307],{},[29,8308,8309],{},"https:\u002F\u002Fregistry.cnpmjs.org",[712,8311,8312],{},[13,8313,8314,8315,8318,8319,1911],{},"淘宝源域名 ",[29,8316,8317],{},"registry.npm.taobao.org"," 已废弃，新域名为 ",[29,8320,8321],{},"registry.npmmirror.com",[369,8323,8325],{"id":8324},"_14-一次性使用不改配置","1.4 一次性使用（不改配置）",[22,8327,8329],{"className":24,"code":8328,"language":26,"meta":27,"style":27},"npm install --registry=https:\u002F\u002Fregistry.npmmirror.com\nyarn add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\npnpm add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[29,8330,8331,8340,8356],{"__ignoreMap":27},[32,8332,8333,8335,8337],{"class":34,"line":35},[32,8334,8024],{"class":45},[32,8336,2945],{"class":49},[32,8338,8339],{"class":53}," --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[32,8341,8342,8344,8346,8348,8350,8352,8354],{"class":34,"line":42},[32,8343,8184],{"class":45},[32,8345,276],{"class":49},[32,8347,280],{"class":279},[32,8349,2950],{"class":49},[32,8351,2953],{"class":286},[32,8353,290],{"class":279},[32,8355,8339],{"class":53},[32,8357,8358,8360,8362,8364,8366,8368,8370],{"class":34,"line":63},[32,8359,8226],{"class":45},[32,8361,276],{"class":49},[32,8363,280],{"class":279},[32,8365,2950],{"class":49},[32,8367,2953],{"class":286},[32,8369,290],{"class":279},[32,8371,8339],{"class":53},[369,8373,8375],{"id":8374},"_15-项目级-npmrc","1.5 项目级 .npmrc",[13,8377,8378,8381],{},[717,8379,8380],{},"只在当前项目生效","，适合团队统一配置。放项目根目录：",[22,8383,8385],{"className":5856,"code":8384,"language":5858,"meta":27,"style":27},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nstrict-ssl=true\nsave-exact=true\nengine-strict=true\n",[29,8386,8387,8392,8397,8402,8407],{"__ignoreMap":27},[32,8388,8389],{"class":34,"line":35},[32,8390,8391],{},"# .npmrc\n",[32,8393,8394],{"class":34,"line":42},[32,8395,8396],{},"registry=https:\u002F\u002Fregistry.npmmirror.com\n",[32,8398,8399],{"class":34,"line":63},[32,8400,8401],{},"strict-ssl=true\n",[32,8403,8404],{"class":34,"line":78},[32,8405,8406],{},"save-exact=true\n",[32,8408,8409],{"class":34,"line":85},[32,8410,8411],{},"engine-strict=true\n",[13,8413,8414,8417],{},[717,8415,8416],{},"提交到 Git","，让所有成员和 CI 用同一套源。",[369,8419,8421],{"id":8420},"_16-私有源-公共源混用scoped-registry","1.6 私有源 + 公共源混用（scoped registry）",[13,8423,8424],{},"公司包放私有源，公共包走镜像：",[22,8426,8428],{"className":5856,"code":8427,"language":5858,"meta":27,"style":27},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\n@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[29,8429,8430,8434,8438,8443,8448],{"__ignoreMap":27},[32,8431,8432],{"class":34,"line":35},[32,8433,8391],{},[32,8435,8436],{"class":34,"line":42},[32,8437,8396],{},[32,8439,8440],{"class":34,"line":63},[32,8441,8442],{},"@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n",[32,8444,8445],{"class":34,"line":78},[32,8446,8447],{},"\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n",[32,8449,8450],{"class":34,"line":85},[32,8451,8452],{},"\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[13,8454,8455,8458,8459,8462],{},[29,8456,8457],{},"@company"," 开头的包（如 ",[29,8460,8461],{},"@company\u002Fui","）走私有源，其余走淘宝源。",[369,8464,8466],{"id":8465},"_17-认证-token-配置","1.7 认证 Token 配置",[22,8468,8470],{"className":5856,"code":8469,"language":5858,"meta":27,"style":27},"# ~\u002F.npmrc\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[29,8471,8472,8477,8482],{"__ignoreMap":27},[32,8473,8474],{"class":34,"line":35},[32,8475,8476],{},"# ~\u002F.npmrc\n",[32,8478,8479],{"class":34,"line":42},[32,8480,8481],{},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n",[32,8483,8484],{"class":34,"line":63},[32,8485,8486],{},"\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[13,8488,8489],{},"或用环境变量（推荐 CI 使用）：",[22,8491,8493],{"className":24,"code":8492,"language":26,"meta":27,"style":27},"export NPM_TOKEN=xxxxx\n# .npmrc 里写\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=${NPM_TOKEN}\n",[29,8494,8495,8507,8512],{"__ignoreMap":27},[32,8496,8497,8499,8502,8504],{"class":34,"line":35},[32,8498,6854],{"class":279},[32,8500,8501],{"class":286}," NPM_TOKEN",[32,8503,6860],{"class":279},[32,8505,8506],{"class":286},"xxxxx\n",[32,8508,8509],{"class":34,"line":42},[32,8510,8511],{"class":38},"# .npmrc 里写\n",[32,8513,8514,8517,8519],{"class":34,"line":63},[32,8515,8516],{"class":45},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken",[32,8518,6860],{"class":49},[32,8520,8521],{"class":286},"${NPM_TOKEN}\n",[369,8523,8525],{"id":8524},"_18-换源失败的排查","1.8 换源失败的排查",[22,8527,8529],{"className":24,"code":8528,"language":26,"meta":27,"style":27},"# 1. 确认当前源\nnpm config get registry\n\n# 2. 直接 curl 试\ncurl -I https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n\n# 3. 清除 npm 缓存\nnpm cache clean --force\n\n# 4. 检查是否有多个 .npmrc 冲突\nnpm config list --show-origin\n",[29,8530,8531,8536,8546,8550,8555,8564,8568,8573,8585,8589,8594],{"__ignoreMap":27},[32,8532,8533],{"class":34,"line":35},[32,8534,8535],{"class":38},"# 1. 确认当前源\n",[32,8537,8538,8540,8542,8544],{"class":34,"line":42},[32,8539,8024],{"class":45},[32,8541,50],{"class":49},[32,8543,8154],{"class":49},[32,8545,8157],{"class":49},[32,8547,8548],{"class":34,"line":63},[32,8549,82],{"emptyLinePlaceholder":81},[32,8551,8552],{"class":34,"line":78},[32,8553,8554],{"class":38},"# 2. 直接 curl 试\n",[32,8556,8557,8559,8561],{"class":34,"line":85},[32,8558,4755],{"class":45},[32,8560,4758],{"class":53},[32,8562,8563],{"class":49}," https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n",[32,8565,8566],{"class":34,"line":91},[32,8567,82],{"emptyLinePlaceholder":81},[32,8569,8570],{"class":34,"line":106},[32,8571,8572],{"class":38},"# 3. 清除 npm 缓存\n",[32,8574,8575,8577,8580,8582],{"class":34,"line":111},[32,8576,8024],{"class":45},[32,8578,8579],{"class":49}," cache",[32,8581,2638],{"class":49},[32,8583,8584],{"class":53}," --force\n",[32,8586,8587],{"class":34,"line":117},[32,8588,82],{"emptyLinePlaceholder":81},[32,8590,8591],{"class":34,"line":132},[32,8592,8593],{"class":38},"# 4. 检查是否有多个 .npmrc 冲突\n",[32,8595,8596,8598,8600,8602],{"class":34,"line":137},[32,8597,8024],{"class":45},[32,8599,50],{"class":49},[32,8601,1088],{"class":49},[32,8603,250],{"class":53},[17,8605,8607],{"id":8606},"二其他-binary-镜像换源只改-npm-包不改-binary","二、其他 binary 镜像（换源只改 npm 包，不改 binary）",[13,8609,8610,8611,8614,8615,8618],{},"很多包在 ",[29,8612,8613],{},"postinstall"," 阶段会下载",[717,8616,8617],{},"非 npm 的二进制","，换 registry 没用。这些要单独配：",[369,8620,8622],{"id":8621},"_21-node-版本管理器镜像","2.1 Node 版本管理器镜像",[13,8624,8625,2443],{},[717,8626,8627],{},"nvm",[22,8629,8631],{"className":24,"code":8630,"language":26,"meta":27,"style":27},"export NVM_NODEJS_ORG_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\nnvm install 20\n",[29,8632,8633,8645],{"__ignoreMap":27},[32,8634,8635,8637,8640,8642],{"class":34,"line":35},[32,8636,6854],{"class":279},[32,8638,8639],{"class":286}," NVM_NODEJS_ORG_MIRROR",[32,8641,6860],{"class":279},[32,8643,8644],{"class":286},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[32,8646,8647,8649,8651],{"class":34,"line":42},[32,8648,8627],{"class":45},[32,8650,2945],{"class":49},[32,8652,3702],{"class":53},[13,8654,8655,8656,8659,8660,8663],{},"写入 ",[29,8657,8658],{},"~\u002F.bashrc"," 或 ",[29,8661,8662],{},"~\u002F.zshrc"," 永久生效。",[13,8665,8666,2443],{},[717,8667,8668],{},"fnm",[22,8670,8672],{"className":24,"code":8671,"language":26,"meta":27,"style":27},"export FNM_NODE_DIST_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[29,8673,8674],{"__ignoreMap":27},[32,8675,8676,8678,8681,8683],{"class":34,"line":35},[32,8677,6854],{"class":279},[32,8679,8680],{"class":286}," FNM_NODE_DIST_MIRROR",[32,8682,6860],{"class":279},[32,8684,8644],{"class":286},[369,8686,8688],{"id":8687},"_22-electron","2.2 Electron",[22,8690,8692],{"className":24,"code":8691,"language":26,"meta":27,"style":27},"# 项目 .npmrc\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[29,8693,8694,8699,8709],{"__ignoreMap":27},[32,8695,8696],{"class":34,"line":35},[32,8697,8698],{"class":38},"# 项目 .npmrc\n",[32,8700,8701,8704,8706],{"class":34,"line":42},[32,8702,8703],{"class":286},"electron_mirror",[32,8705,6860],{"class":279},[32,8707,8708],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[32,8710,8711,8714,8716],{"class":34,"line":63},[32,8712,8713],{"class":286},"electron_builder_binaries_mirror",[32,8715,6860],{"class":279},[32,8717,8718],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[369,8720,8722],{"id":8721},"_23-puppeteer-playwright","2.3 Puppeteer \u002F Playwright",[22,8724,8726],{"className":24,"code":8725,"language":26,"meta":27,"style":27},"# .npmrc 或环境变量\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[29,8727,8728,8733,8743],{"__ignoreMap":27},[32,8729,8730],{"class":34,"line":35},[32,8731,8732],{"class":38},"# .npmrc 或环境变量\n",[32,8734,8735,8738,8740],{"class":34,"line":42},[32,8736,8737],{"class":286},"puppeteer_download_host",[32,8739,6860],{"class":279},[32,8741,8742],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[32,8744,8745,8748,8750],{"class":34,"line":63},[32,8746,8747],{"class":286},"PLAYWRIGHT_DOWNLOAD_HOST",[32,8749,6860],{"class":279},[32,8751,8752],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[369,8754,8756],{"id":8755},"_24-node-sass-sass-embedded","2.4 node-sass \u002F sass-embedded",[22,8758,8760],{"className":24,"code":8759,"language":26,"meta":27,"style":27},"# .npmrc\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[29,8761,8762,8766],{"__ignoreMap":27},[32,8763,8764],{"class":34,"line":35},[32,8765,8391],{"class":38},[32,8767,8768,8771,8773],{"class":34,"line":42},[32,8769,8770],{"class":286},"sass_binary_site",[32,8772,6860],{"class":279},[32,8774,8775],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[13,8777,8778,8779,8782],{},"现在多用 ",[29,8780,8781],{},"sass","（dart-sass 纯 JS 实现），无需 binary。",[369,8784,8786],{"id":8785},"_25-sharp-canvas","2.5 sharp \u002F canvas",[22,8788,8790],{"className":24,"code":8789,"language":26,"meta":27,"style":27},"# .npmrc\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[29,8791,8792,8796,8806,8816],{"__ignoreMap":27},[32,8793,8794],{"class":34,"line":35},[32,8795,8391],{"class":38},[32,8797,8798,8801,8803],{"class":34,"line":42},[32,8799,8800],{"class":286},"sharp_binary_host",[32,8802,6860],{"class":279},[32,8804,8805],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[32,8807,8808,8811,8813],{"class":34,"line":63},[32,8809,8810],{"class":286},"sharp_libvips_binary_host",[32,8812,6860],{"class":279},[32,8814,8815],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[32,8817,8818,8821,8823],{"class":34,"line":78},[32,8819,8820],{"class":286},"canvas_binary_host_mirror",[32,8822,6860],{"class":279},[32,8824,8825],{"class":49},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[369,8827,8829],{"id":8828},"_26-cypress","2.6 Cypress",[22,8831,8833],{"className":24,"code":8832,"language":26,"meta":27,"style":27},"export CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[29,8834,8835],{"__ignoreMap":27},[32,8836,8837,8839,8842,8844],{"class":34,"line":35},[32,8838,6854],{"class":279},[32,8840,8841],{"class":286}," CYPRESS_DOWNLOAD_MIRROR",[32,8843,6860],{"class":279},[32,8845,8846],{"class":286},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[369,8848,8850],{"id":8849},"_27-全家桶模板","2.7 全家桶模板",[22,8852,8854],{"className":5856,"code":8853,"language":5858,"meta":27,"style":27},"# ~\u002F.npmrc 一份全搞定\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\nCYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[29,8855,8856,8861,8865,8870,8875,8880,8885,8890,8895,8900,8905],{"__ignoreMap":27},[32,8857,8858],{"class":34,"line":35},[32,8859,8860],{},"# ~\u002F.npmrc 一份全搞定\n",[32,8862,8863],{"class":34,"line":42},[32,8864,8396],{},[32,8866,8867],{"class":34,"line":63},[32,8868,8869],{},"electron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[32,8871,8872],{"class":34,"line":78},[32,8873,8874],{},"electron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[32,8876,8877],{"class":34,"line":85},[32,8878,8879],{},"puppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[32,8881,8882],{"class":34,"line":91},[32,8883,8884],{},"PLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[32,8886,8887],{"class":34,"line":106},[32,8888,8889],{},"sass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[32,8891,8892],{"class":34,"line":111},[32,8893,8894],{},"sharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[32,8896,8897],{"class":34,"line":117},[32,8898,8899],{},"sharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[32,8901,8902],{"class":34,"line":132},[32,8903,8904],{},"canvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[32,8906,8907],{"class":34,"line":137},[32,8908,8909],{},"CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[17,8911,8913],{"id":8912},"三命令对照速查","三、命令对照速查",[729,8915,8916,8930],{},[732,8917,8918],{},[735,8919,8920,8923,8925,8928],{},[738,8921,8922],{},"操作",[738,8924,8024],{},[738,8926,8927],{},"yarn (v1)",[738,8929,8226],{},[751,8931,8932,8951,8971,8991,9011,9026,9046,9066,9086,9106,9126,9144,9164,9184,9204],{},[735,8933,8934,8937,8942,8946],{},[756,8935,8936],{},"安装全部",[756,8938,8939],{},[29,8940,8941],{},"npm install",[756,8943,8944],{},[29,8945,8184],{},[756,8947,8948],{},[29,8949,8950],{},"pnpm install",[735,8952,8953,8956,8961,8966],{},[756,8954,8955],{},"安装生产依赖",[756,8957,8958],{},[29,8959,8960],{},"npm i \u003Cpkg>",[756,8962,8963],{},[29,8964,8965],{},"yarn add \u003Cpkg>",[756,8967,8968],{},[29,8969,8970],{},"pnpm add \u003Cpkg>",[735,8972,8973,8976,8981,8986],{},[756,8974,8975],{},"安装开发依赖",[756,8977,8978],{},[29,8979,8980],{},"npm i -D \u003Cpkg>",[756,8982,8983],{},[29,8984,8985],{},"yarn add -D \u003Cpkg>",[756,8987,8988],{},[29,8989,8990],{},"pnpm add -D \u003Cpkg>",[735,8992,8993,8996,9001,9006],{},[756,8994,8995],{},"安装全局",[756,8997,8998],{},[29,8999,9000],{},"npm i -g \u003Cpkg>",[756,9002,9003],{},[29,9004,9005],{},"yarn global add \u003Cpkg>",[756,9007,9008],{},[29,9009,9010],{},"pnpm add -g \u003Cpkg>",[735,9012,9013,9016,9021,9024],{},[756,9014,9015],{},"安装指定版本",[756,9017,9018],{},[29,9019,9020],{},"npm i \u003Cpkg>@1.2.3",[756,9022,9023],{},"同",[756,9025,9023],{},[735,9027,9028,9031,9036,9041],{},[756,9029,9030],{},"卸载",[756,9032,9033],{},[29,9034,9035],{},"npm uninstall \u003Cpkg>",[756,9037,9038],{},[29,9039,9040],{},"yarn remove \u003Cpkg>",[756,9042,9043],{},[29,9044,9045],{},"pnpm remove \u003Cpkg>",[735,9047,9048,9051,9056,9061],{},[756,9049,9050],{},"卸载全局",[756,9052,9053],{},[29,9054,9055],{},"npm uninstall -g \u003Cpkg>",[756,9057,9058],{},[29,9059,9060],{},"yarn global remove \u003Cpkg>",[756,9062,9063],{},[29,9064,9065],{},"pnpm remove -g \u003Cpkg>",[735,9067,9068,9071,9076,9081],{},[756,9069,9070],{},"更新全部",[756,9072,9073],{},[29,9074,9075],{},"npm update",[756,9077,9078],{},[29,9079,9080],{},"yarn upgrade",[756,9082,9083],{},[29,9084,9085],{},"pnpm update",[735,9087,9088,9091,9096,9101],{},[756,9089,9090],{},"运行脚本",[756,9092,9093],{},[29,9094,9095],{},"npm run \u003Cs>",[756,9097,9098],{},[29,9099,9100],{},"yarn \u003Cs>",[756,9102,9103],{},[29,9104,9105],{},"pnpm \u003Cs>",[735,9107,9108,9111,9116,9121],{},[756,9109,9110],{},"执行本地二进制",[756,9112,9113],{},[29,9114,9115],{},"npx \u003Cbin>",[756,9117,9118],{},[29,9119,9120],{},"yarn \u003Cbin>",[756,9122,9123],{},[29,9124,9125],{},"pnpm exec \u003Cbin>",[735,9127,9128,9131,9136,9139],{},[756,9129,9130],{},"执行远程包",[756,9132,9133],{},[29,9134,9135],{},"npx \u003Cpkg>",[756,9137,9138],{},"—",[756,9140,9141],{},[29,9142,9143],{},"pnpm dlx \u003Cpkg>",[735,9145,9146,9149,9154,9159],{},[756,9147,9148],{},"查看顶层依赖",[756,9150,9151],{},[29,9152,9153],{},"npm ls --depth=0",[756,9155,9156],{},[29,9157,9158],{},"yarn list --depth=0",[756,9160,9161],{},[29,9162,9163],{},"pnpm list --depth=0",[735,9165,9166,9169,9174,9179],{},[756,9167,9168],{},"查过时依赖",[756,9170,9171],{},[29,9172,9173],{},"npm outdated",[756,9175,9176],{},[29,9177,9178],{},"yarn outdated",[756,9180,9181],{},[29,9182,9183],{},"pnpm outdated",[735,9185,9186,9189,9194,9199],{},[756,9187,9188],{},"清缓存",[756,9190,9191],{},[29,9192,9193],{},"npm cache clean --force",[756,9195,9196],{},[29,9197,9198],{},"yarn cache clean",[756,9200,9201],{},[29,9202,9203],{},"pnpm store prune",[735,9205,9206,9209,9214,9219],{},[756,9207,9208],{},"查看为什么装了某包",[756,9210,9211],{},[29,9212,9213],{},"npm why \u003Cpkg>",[756,9215,9216],{},[29,9217,9218],{},"yarn why \u003Cpkg>",[756,9220,9221],{},[29,9222,9223],{},"pnpm why \u003Cpkg>",[17,9225,9227],{"id":9226},"四锁文件","四、锁文件",[729,9229,9230,9243],{},[732,9231,9232],{},[735,9233,9234,9237,9240],{},[738,9235,9236],{},"包管理器",[738,9238,9239],{},"锁文件",[738,9241,9242],{},"提交 Git",[751,9244,9245,9257,9269],{},[735,9246,9247,9249,9254],{},[756,9248,8024],{},[756,9250,9251],{},[29,9252,9253],{},"package-lock.json",[756,9255,9256],{},"✅",[735,9258,9259,9262,9267],{},[756,9260,9261],{},"yarn v1",[756,9263,9264],{},[29,9265,9266],{},"yarn.lock",[756,9268,9256],{},[735,9270,9271,9273,9278],{},[756,9272,8226],{},[756,9274,9275],{},[29,9276,9277],{},"pnpm-lock.yaml",[756,9279,9256],{},[13,9281,9282,9285],{},[717,9283,9284],{},"同一仓库只保留一种锁文件","。混用会导致依赖树不一致。",[369,9287,9288],{"id":9288},"清理重装",[22,9290,9292],{"className":24,"code":9291,"language":26,"meta":27,"style":27},"# npm\nrm -rf node_modules package-lock.json && npm install\n\n# yarn\nrm -rf node_modules yarn.lock && yarn install\n\n# pnpm\nrm -rf node_modules pnpm-lock.yaml && pnpm install\n",[29,9293,9294,9298,9317,9321,9326,9343,9347,9351],{"__ignoreMap":27},[32,9295,9296],{"class":34,"line":35},[32,9297,8131],{"class":38},[32,9299,9300,9302,9304,9307,9310,9312,9314],{"class":34,"line":42},[32,9301,3368],{"class":45},[32,9303,3371],{"class":53},[32,9305,9306],{"class":49}," node_modules",[32,9308,9309],{"class":49}," package-lock.json",[32,9311,2728],{"class":286},[32,9313,8024],{"class":45},[32,9315,9316],{"class":49}," install\n",[32,9318,9319],{"class":34,"line":63},[32,9320,82],{"emptyLinePlaceholder":81},[32,9322,9323],{"class":34,"line":78},[32,9324,9325],{"class":38},"# yarn\n",[32,9327,9328,9330,9332,9334,9337,9339,9341],{"class":34,"line":85},[32,9329,3368],{"class":45},[32,9331,3371],{"class":53},[32,9333,9306],{"class":49},[32,9335,9336],{"class":49}," yarn.lock",[32,9338,2728],{"class":286},[32,9340,8184],{"class":45},[32,9342,9316],{"class":49},[32,9344,9345],{"class":34,"line":91},[32,9346,82],{"emptyLinePlaceholder":81},[32,9348,9349],{"class":34,"line":106},[32,9350,8221],{"class":38},[32,9352,9353,9355,9357,9359,9362,9364,9366],{"class":34,"line":111},[32,9354,3368],{"class":45},[32,9356,3371],{"class":53},[32,9358,9306],{"class":49},[32,9360,9361],{"class":49}," pnpm-lock.yaml",[32,9363,2728],{"class":286},[32,9365,8226],{"class":45},[32,9367,9316],{"class":49},[369,9369,9371],{"id":9370},"ci-严格安装","CI 严格安装",[22,9373,9375],{"className":24,"code":9374,"language":26,"meta":27,"style":27},"npm ci                            # 严格按 lock 装，不更新\npnpm install --frozen-lockfile\nyarn install --frozen-lockfile\n",[29,9376,9377,9387,9396],{"__ignoreMap":27},[32,9378,9379,9381,9384],{"class":34,"line":35},[32,9380,8024],{"class":45},[32,9382,9383],{"class":49}," ci",[32,9385,9386],{"class":38},"                            # 严格按 lock 装，不更新\n",[32,9388,9389,9391,9393],{"class":34,"line":42},[32,9390,8226],{"class":45},[32,9392,2945],{"class":49},[32,9394,9395],{"class":53}," --frozen-lockfile\n",[32,9397,9398,9400,9402],{"class":34,"line":63},[32,9399,8184],{"class":45},[32,9401,2945],{"class":49},[32,9403,9395],{"class":53},[13,9405,9406,9409,9410,9412,9413,9416],{},[29,9407,9408],{},"npm ci"," 要求 ",[29,9411,9253],{}," 与 ",[29,9414,9415],{},"package.json"," 完全一致，否则直接报错退出。",[17,9418,9420],{"id":9419},"五依赖版本语义","五、依赖版本语义",[729,9422,9423,9433],{},[732,9424,9425],{},[735,9426,9427,9430],{},[738,9428,9429],{},"写法",[738,9431,9432],{},"允许升级范围",[751,9434,9435,9445,9457,9469,9482],{},[735,9436,9437,9442],{},[756,9438,9439],{},[29,9440,9441],{},"1.2.3",[756,9443,9444],{},"精确，不升级",[735,9446,9447,9452],{},[756,9448,9449],{},[29,9450,9451],{},"~1.2.3",[756,9453,9454],{},[29,9455,9456],{},">=1.2.3 \u003C1.3.0",[735,9458,9459,9464],{},[756,9460,9461],{},[29,9462,9463],{},"^1.2.3",[756,9465,9466],{},[29,9467,9468],{},">=1.2.3 \u003C2.0.0",[735,9470,9471,9476],{},[756,9472,9473],{},[29,9474,9475],{},"^0.2.3",[756,9477,9478,9481],{},[29,9479,9480],{},">=0.2.3 \u003C0.3.0","（0.x 例外，锁次版本）",[735,9483,9484,9491],{},[756,9485,9486,2261,9488],{},[29,9487,2599],{},[29,9489,9490],{},"latest",[756,9492,9493],{},"不限（不推荐）",[17,9495,9497],{"id":9496},"六脚本scripts","六、脚本（scripts）",[369,9499,9500],{"id":9500},"钩子",[729,9502,9503,9512],{},[732,9504,9505],{},[735,9506,9507,9509],{},[738,9508,9500],{},[738,9510,9511],{},"触发时机",[751,9513,9514,9524,9533,9543,9557,9569],{},[735,9515,9516,9521],{},[756,9517,9518],{},[29,9519,9520],{},"preinstall",[756,9522,9523],{},"install 之前",[735,9525,9526,9530],{},[756,9527,9528],{},[29,9529,8613],{},[756,9531,9532],{},"install 之后",[735,9534,9535,9540],{},[756,9536,9537],{},[29,9538,9539],{},"prepare",[756,9541,9542],{},"install 和 publish 之前都触发（husky 常用）",[735,9544,9545,9550],{},[756,9546,9547],{},[29,9548,9549],{},"prepublishOnly",[756,9551,9552,9553,9556],{},"仅 ",[29,9554,9555],{},"npm publish"," 之前",[735,9558,9559,9564],{},[756,9560,9561],{},[29,9562,9563],{},"pre\u003Cscript>",[756,9565,9566,9556],{},[29,9567,9568],{},"npm run \u003Cscript>",[735,9570,9571,9576],{},[756,9572,9573],{},[29,9574,9575],{},"post\u003Cscript>",[756,9577,9578],{},"执行之后",[369,9580,9581],{"id":9581},"传参与环境变量",[22,9583,9585],{"className":24,"code":9584,"language":26,"meta":27,"style":27},"npm run build -- --mode production\nyarn build --mode production\npnpm build --mode production\n\n# 跨平台环境变量\nnpm i -D cross-env\n\"build\": \"cross-env NODE_ENV=production vite build\"\n",[29,9586,9587,9605,9615,9625,9629,9634,9646],{"__ignoreMap":27},[32,9588,9589,9591,9594,9597,9599,9602],{"class":34,"line":35},[32,9590,8024],{"class":45},[32,9592,9593],{"class":49}," run",[32,9595,9596],{"class":49}," build",[32,9598,847],{"class":53},[32,9600,9601],{"class":53}," --mode",[32,9603,9604],{"class":49}," production\n",[32,9606,9607,9609,9611,9613],{"class":34,"line":42},[32,9608,8184],{"class":45},[32,9610,9596],{"class":49},[32,9612,9601],{"class":53},[32,9614,9604],{"class":49},[32,9616,9617,9619,9621,9623],{"class":34,"line":63},[32,9618,8226],{"class":45},[32,9620,9596],{"class":49},[32,9622,9601],{"class":53},[32,9624,9604],{"class":49},[32,9626,9627],{"class":34,"line":78},[32,9628,82],{"emptyLinePlaceholder":81},[32,9630,9631],{"class":34,"line":85},[32,9632,9633],{"class":38},"# 跨平台环境变量\n",[32,9635,9636,9638,9641,9643],{"class":34,"line":91},[32,9637,8024],{"class":45},[32,9639,9640],{"class":49}," i",[32,9642,587],{"class":53},[32,9644,9645],{"class":49}," cross-env\n",[32,9647,9648,9651,9653],{"class":34,"line":106},[32,9649,9650],{"class":45},"\"build\"",[32,9652,7661],{"class":3324},[32,9654,9655],{"class":49}," \"cross-env NODE_ENV=production vite build\"\n",[17,9657,9659],{"id":9658},"七依赖管理","七、依赖管理",[369,9661,9663],{"id":9662},"overrides-resolutions强制覆盖版本","overrides \u002F resolutions（强制覆盖版本）",[13,9665,9666,2443],{},[717,9667,9668],{},"npm (>= 8.3)",[22,9670,9672],{"className":3032,"code":9671,"language":3034,"meta":27,"style":27},"{\n  \"overrides\": {\n    \"lodash\": \"4.17.21\",\n    \"some-pkg\": { \"lodash\": \"4.17.21\" }\n  }\n}\n",[29,9673,9674,9678,9686,9699,9717,9722],{"__ignoreMap":27},[32,9675,9676],{"class":34,"line":35},[32,9677,3041],{"class":286},[32,9679,9680,9683],{"class":34,"line":42},[32,9681,9682],{"class":3046},"  \"overrides\"",[32,9684,9685],{"class":286},": {\n",[32,9687,9688,9691,9694,9697],{"class":34,"line":63},[32,9689,9690],{"class":3046},"    \"lodash\"",[32,9692,9693],{"class":286},": ",[32,9695,9696],{"class":3055},"\"4.17.21\"",[32,9698,3059],{"class":286},[32,9700,9701,9704,9707,9710,9712,9714],{"class":34,"line":78},[32,9702,9703],{"class":3046},"    \"some-pkg\"",[32,9705,9706],{"class":286},": { ",[32,9708,9709],{"class":3046},"\"lodash\"",[32,9711,9693],{"class":286},[32,9713,9696],{"class":3055},[32,9715,9716],{"class":286}," }\n",[32,9718,9719],{"class":34,"line":85},[32,9720,9721],{"class":286},"  }\n",[32,9723,9724],{"class":34,"line":91},[32,9725,3088],{"class":286},[13,9727,9728,2443],{},[717,9729,9261],{},[22,9731,9733],{"className":3032,"code":9732,"language":3034,"meta":27,"style":27},"{\n  \"resolutions\": {\n    \"lodash\": \"4.17.21\",\n    \"**\u002Flodash\": \"4.17.21\"\n  }\n}\n",[29,9734,9735,9739,9746,9756,9766,9770],{"__ignoreMap":27},[32,9736,9737],{"class":34,"line":35},[32,9738,3041],{"class":286},[32,9740,9741,9744],{"class":34,"line":42},[32,9742,9743],{"class":3046},"  \"resolutions\"",[32,9745,9685],{"class":286},[32,9747,9748,9750,9752,9754],{"class":34,"line":63},[32,9749,9690],{"class":3046},[32,9751,9693],{"class":286},[32,9753,9696],{"class":3055},[32,9755,3059],{"class":286},[32,9757,9758,9761,9763],{"class":34,"line":78},[32,9759,9760],{"class":3046},"    \"**\u002Flodash\"",[32,9762,9693],{"class":286},[32,9764,9765],{"class":3055},"\"4.17.21\"\n",[32,9767,9768],{"class":34,"line":85},[32,9769,9721],{"class":286},[32,9771,9772],{"class":34,"line":91},[32,9773,3088],{"class":286},[13,9775,9776,2443],{},[717,9777,8226],{},[22,9779,9781],{"className":3032,"code":9780,"language":3034,"meta":27,"style":27},"{\n  \"pnpm\": {\n    \"overrides\": {\n      \"lodash\": \"4.17.21\"\n    }\n  }\n}\n",[29,9782,9783,9787,9794,9801,9810,9815,9819],{"__ignoreMap":27},[32,9784,9785],{"class":34,"line":35},[32,9786,3041],{"class":286},[32,9788,9789,9792],{"class":34,"line":42},[32,9790,9791],{"class":3046},"  \"pnpm\"",[32,9793,9685],{"class":286},[32,9795,9796,9799],{"class":34,"line":63},[32,9797,9798],{"class":3046},"    \"overrides\"",[32,9800,9685],{"class":286},[32,9802,9803,9806,9808],{"class":34,"line":78},[32,9804,9805],{"class":3046},"      \"lodash\"",[32,9807,9693],{"class":286},[32,9809,9765],{"class":3055},[32,9811,9812],{"class":34,"line":85},[32,9813,9814],{"class":286},"    }\n",[32,9816,9817],{"class":34,"line":91},[32,9818,9721],{"class":286},[32,9820,9821],{"class":34,"line":106},[32,9822,3088],{"class":286},[369,9824,9825],{"id":9825},"依赖分析",[22,9827,9829],{"className":24,"code":9828,"language":26,"meta":27,"style":27},"npm ls \u003Cpkg>                      # 谁依赖了它\nnpm why \u003Cpkg>                     # 同上（npm 8+）\npnpm why \u003Cpkg>\nyarn why \u003Cpkg>\n",[29,9830,9831,9848,9866,9880],{"__ignoreMap":27},[32,9832,9833,9835,9837,9839,9841,9843,9845],{"class":34,"line":35},[32,9834,8024],{"class":45},[32,9836,8044],{"class":49},[32,9838,280],{"class":279},[32,9840,2950],{"class":49},[32,9842,2953],{"class":286},[32,9844,290],{"class":279},[32,9846,9847],{"class":38},"                      # 谁依赖了它\n",[32,9849,9850,9852,9855,9857,9859,9861,9863],{"class":34,"line":42},[32,9851,8024],{"class":45},[32,9853,9854],{"class":49}," why",[32,9856,280],{"class":279},[32,9858,2950],{"class":49},[32,9860,2953],{"class":286},[32,9862,290],{"class":279},[32,9864,9865],{"class":38},"                     # 同上（npm 8+）\n",[32,9867,9868,9870,9872,9874,9876,9878],{"class":34,"line":63},[32,9869,8226],{"class":45},[32,9871,9854],{"class":49},[32,9873,280],{"class":279},[32,9875,2950],{"class":49},[32,9877,2953],{"class":286},[32,9879,1000],{"class":279},[32,9881,9882,9884,9886,9888,9890,9892],{"class":34,"line":78},[32,9883,8184],{"class":45},[32,9885,9854],{"class":49},[32,9887,280],{"class":279},[32,9889,2950],{"class":49},[32,9891,2953],{"class":286},[32,9893,1000],{"class":279},[17,9895,9897],{"id":9896},"八npm-专属","八、npm 专属",[22,9899,9901],{"className":24,"code":9900,"language":26,"meta":27,"style":27},"npm view \u003Cpkg>                    # 包信息\nnpm view \u003Cpkg> versions           # 所有版本\nnpm view \u003Cpkg> dist-tags          # 标签\nnpm info \u003Cpkg> repository.url     # 仓库地址\n\nnpm login\nnpm publish                       # 发布\nnpm publish --access public       # scoped 包首次发布\nnpm publish --tag beta            # 打标签\nnpm unpublish \u003Cpkg>@1.0.0         # 撤销（24h 内）\n",[29,9902,9903,9921,9941,9961,9981,9985,9992,10002,10017,10032],{"__ignoreMap":27},[32,9904,9905,9907,9910,9912,9914,9916,9918],{"class":34,"line":35},[32,9906,8024],{"class":45},[32,9908,9909],{"class":49}," view",[32,9911,280],{"class":279},[32,9913,2950],{"class":49},[32,9915,2953],{"class":286},[32,9917,290],{"class":279},[32,9919,9920],{"class":38},"                    # 包信息\n",[32,9922,9923,9925,9927,9929,9931,9933,9935,9938],{"class":34,"line":42},[32,9924,8024],{"class":45},[32,9926,9909],{"class":49},[32,9928,280],{"class":279},[32,9930,2950],{"class":49},[32,9932,2953],{"class":286},[32,9934,290],{"class":279},[32,9936,9937],{"class":49}," versions",[32,9939,9940],{"class":38},"           # 所有版本\n",[32,9942,9943,9945,9947,9949,9951,9953,9955,9958],{"class":34,"line":63},[32,9944,8024],{"class":45},[32,9946,9909],{"class":49},[32,9948,280],{"class":279},[32,9950,2950],{"class":49},[32,9952,2953],{"class":286},[32,9954,290],{"class":279},[32,9956,9957],{"class":49}," dist-tags",[32,9959,9960],{"class":38},"          # 标签\n",[32,9962,9963,9965,9967,9969,9971,9973,9975,9978],{"class":34,"line":78},[32,9964,8024],{"class":45},[32,9966,3123],{"class":49},[32,9968,280],{"class":279},[32,9970,2950],{"class":49},[32,9972,2953],{"class":286},[32,9974,290],{"class":279},[32,9976,9977],{"class":49}," repository.url",[32,9979,9980],{"class":38},"     # 仓库地址\n",[32,9982,9983],{"class":34,"line":85},[32,9984,82],{"emptyLinePlaceholder":81},[32,9986,9987,9989],{"class":34,"line":91},[32,9988,8024],{"class":45},[32,9990,9991],{"class":49}," login\n",[32,9993,9994,9996,9999],{"class":34,"line":106},[32,9995,8024],{"class":45},[32,9997,9998],{"class":49}," publish",[32,10000,10001],{"class":38},"                       # 发布\n",[32,10003,10004,10006,10008,10011,10014],{"class":34,"line":111},[32,10005,8024],{"class":45},[32,10007,9998],{"class":49},[32,10009,10010],{"class":53}," --access",[32,10012,10013],{"class":49}," public",[32,10015,10016],{"class":38},"       # scoped 包首次发布\n",[32,10018,10019,10021,10023,10026,10029],{"class":34,"line":117},[32,10020,8024],{"class":45},[32,10022,9998],{"class":49},[32,10024,10025],{"class":53}," --tag",[32,10027,10028],{"class":49}," beta",[32,10030,10031],{"class":38},"            # 打标签\n",[32,10033,10034,10036,10039,10041,10043,10045,10047,10050],{"class":34,"line":132},[32,10035,8024],{"class":45},[32,10037,10038],{"class":49}," unpublish",[32,10040,280],{"class":279},[32,10042,2950],{"class":49},[32,10044,2953],{"class":286},[32,10046,290],{"class":279},[32,10048,10049],{"class":49},"@1.0.0",[32,10051,10052],{"class":38},"         # 撤销（24h 内）\n",[17,10054,10056],{"id":10055},"九yarn-v1-专属","九、yarn v1 专属",[369,10058,10059],{"id":10059},"workspaces",[22,10061,10063],{"className":3032,"code":10062,"language":3034,"meta":27,"style":27},"{\n  \"private\": true,\n  \"workspaces\": [\"packages\u002F*\"]\n}\n",[29,10064,10065,10069,10081,10095],{"__ignoreMap":27},[32,10066,10067],{"class":34,"line":35},[32,10068,3041],{"class":286},[32,10070,10071,10074,10076,10079],{"class":34,"line":42},[32,10072,10073],{"class":3046},"  \"private\"",[32,10075,9693],{"class":286},[32,10077,10078],{"class":53},"true",[32,10080,3059],{"class":286},[32,10082,10083,10086,10089,10092],{"class":34,"line":63},[32,10084,10085],{"class":3046},"  \"workspaces\"",[32,10087,10088],{"class":286},": [",[32,10090,10091],{"class":3055},"\"packages\u002F*\"",[32,10093,10094],{"class":286},"]\n",[32,10096,10097],{"class":34,"line":78},[32,10098,3088],{"class":286},[22,10100,10102],{"className":24,"code":10101,"language":26,"meta":27,"style":27},"yarn workspace \u003Cpkg> add \u003Cdep>\nyarn workspaces info\n",[29,10103,10104,10130],{"__ignoreMap":27},[32,10105,10106,10108,10111,10113,10115,10117,10119,10121,10123,10126,10128],{"class":34,"line":35},[32,10107,8184],{"class":45},[32,10109,10110],{"class":49}," workspace",[32,10112,280],{"class":279},[32,10114,2950],{"class":49},[32,10116,2953],{"class":286},[32,10118,290],{"class":279},[32,10120,276],{"class":49},[32,10122,280],{"class":279},[32,10124,10125],{"class":49},"de",[32,10127,13],{"class":286},[32,10129,1000],{"class":279},[32,10131,10132,10134,10137],{"class":34,"line":42},[32,10133,8184],{"class":45},[32,10135,10136],{"class":49}," workspaces",[32,10138,10139],{"class":49}," info\n",[369,10141,10142],{"id":10142},"常用",[22,10144,10146],{"className":24,"code":10145,"language":26,"meta":27,"style":27},"yarn licenses list                # 许可证\nyarn audit                        # 安全审计\nyarn autoclean --init\n",[29,10147,10148,10160,10170],{"__ignoreMap":27},[32,10149,10150,10152,10155,10157],{"class":34,"line":35},[32,10151,8184],{"class":45},[32,10153,10154],{"class":49}," licenses",[32,10156,1088],{"class":49},[32,10158,10159],{"class":38},"                # 许可证\n",[32,10161,10162,10164,10167],{"class":34,"line":42},[32,10163,8184],{"class":45},[32,10165,10166],{"class":49}," audit",[32,10168,10169],{"class":38},"                        # 安全审计\n",[32,10171,10172,10174,10177],{"class":34,"line":63},[32,10173,8184],{"class":45},[32,10175,10176],{"class":49}," autoclean",[32,10178,10179],{"class":53}," --init\n",[712,10181,10182],{},[13,10183,10184],{},"yarn v1 已停止新功能开发，长期建议迁移到 pnpm 或 yarn berry (v2+)。",[17,10186,10188],{"id":10187},"十pnpm-专属","十、pnpm 专属",[369,10190,10191],{"id":10191},"核心优势",[2285,10193,10194,10200,10206],{},[2288,10195,10196,10199],{},[717,10197,10198],{},"硬链接 + 内容寻址存储","：磁盘只存一份包实体，多项目共享。",[2288,10201,10202,10205],{},[717,10203,10204],{},"非扁平化 node_modules","：只有直接依赖可见，杜绝幽灵依赖。",[2288,10207,10208,10211],{},[717,10209,10210],{},"严格 peerDependencies","：不隐式提升未声明依赖。",[369,10213,10142],{"id":10214},"常用-1",[22,10216,10218],{"className":24,"code":10217,"language":26,"meta":27,"style":27},"pnpm store path                   # store 位置\npnpm store prune                  # 清缓存\npnpm dedupe                       # 去重\npnpm patch \u003Cpkg>                  # 打补丁\npnpm patch-commit \u003Cpath>\n\npnpm add -O \u003Cpkg>                 # optionalDependencies\npnpm add -P \u003Cpkg>                 # peerDependencies\n",[29,10219,10220,10233,10245,10255,10273,10289,10293,10313],{"__ignoreMap":27},[32,10221,10222,10224,10227,10230],{"class":34,"line":35},[32,10223,8226],{"class":45},[32,10225,10226],{"class":49}," store",[32,10228,10229],{"class":49}," path",[32,10231,10232],{"class":38},"                   # store 位置\n",[32,10234,10235,10237,10239,10242],{"class":34,"line":42},[32,10236,8226],{"class":45},[32,10238,10226],{"class":49},[32,10240,10241],{"class":49}," prune",[32,10243,10244],{"class":38},"                  # 清缓存\n",[32,10246,10247,10249,10252],{"class":34,"line":63},[32,10248,8226],{"class":45},[32,10250,10251],{"class":49}," dedupe",[32,10253,10254],{"class":38},"                       # 去重\n",[32,10256,10257,10259,10262,10264,10266,10268,10270],{"class":34,"line":78},[32,10258,8226],{"class":45},[32,10260,10261],{"class":49}," patch",[32,10263,280],{"class":279},[32,10265,2950],{"class":49},[32,10267,2953],{"class":286},[32,10269,290],{"class":279},[32,10271,10272],{"class":38},"                  # 打补丁\n",[32,10274,10275,10277,10280,10282,10285,10287],{"class":34,"line":85},[32,10276,8226],{"class":45},[32,10278,10279],{"class":49}," patch-commit",[32,10281,280],{"class":279},[32,10283,10284],{"class":49},"pat",[32,10286,652],{"class":286},[32,10288,1000],{"class":279},[32,10290,10291],{"class":34,"line":91},[32,10292,82],{"emptyLinePlaceholder":81},[32,10294,10295,10297,10299,10302,10304,10306,10308,10310],{"class":34,"line":106},[32,10296,8226],{"class":45},[32,10298,276],{"class":49},[32,10300,10301],{"class":53}," -O",[32,10303,280],{"class":279},[32,10305,2950],{"class":49},[32,10307,2953],{"class":286},[32,10309,290],{"class":279},[32,10311,10312],{"class":38},"                 # optionalDependencies\n",[32,10314,10315,10317,10319,10322,10324,10326,10328,10330],{"class":34,"line":111},[32,10316,8226],{"class":45},[32,10318,276],{"class":49},[32,10320,10321],{"class":53}," -P",[32,10323,280],{"class":279},[32,10325,2950],{"class":49},[32,10327,2953],{"class":286},[32,10329,290],{"class":279},[32,10331,10332],{"class":38},"                 # peerDependencies\n",[369,10334,10335],{"id":10335},"工作区",[22,10337,10341],{"className":10338,"code":10339,"language":10340,"meta":27,"style":27},"language-yaml shiki shiki-themes monokai","# pnpm-workspace.yaml\npackages:\n  - \"packages\u002F*\"\n  - \"apps\u002F*\"\n","yaml",[29,10342,10343,10348,10353,10358],{"__ignoreMap":27},[32,10344,10345],{"class":34,"line":35},[32,10346,10347],{},"# pnpm-workspace.yaml\n",[32,10349,10350],{"class":34,"line":42},[32,10351,10352],{},"packages:\n",[32,10354,10355],{"class":34,"line":63},[32,10356,10357],{},"  - \"packages\u002F*\"\n",[32,10359,10360],{"class":34,"line":78},[32,10361,10362],{},"  - \"apps\u002F*\"\n",[22,10364,10366],{"className":24,"code":10365,"language":26,"meta":27,"style":27},"pnpm -r build                     # 递归所有包\npnpm --filter web build           # 只跑 web\npnpm --filter \"web...\" build      # web 及其依赖\npnpm --filter \"...web\" build      # web 及其被依赖者\n",[29,10367,10368,10379,10394,10408],{"__ignoreMap":27},[32,10369,10370,10372,10374,10376],{"class":34,"line":35},[32,10371,8226],{"class":45},[32,10373,1876],{"class":53},[32,10375,9596],{"class":49},[32,10377,10378],{"class":38},"                     # 递归所有包\n",[32,10380,10381,10383,10386,10389,10391],{"class":34,"line":42},[32,10382,8226],{"class":45},[32,10384,10385],{"class":53}," --filter",[32,10387,10388],{"class":49}," web",[32,10390,9596],{"class":49},[32,10392,10393],{"class":38},"           # 只跑 web\n",[32,10395,10396,10398,10400,10403,10405],{"class":34,"line":63},[32,10397,8226],{"class":45},[32,10399,10385],{"class":53},[32,10401,10402],{"class":49}," \"web...\"",[32,10404,9596],{"class":49},[32,10406,10407],{"class":38},"      # web 及其依赖\n",[32,10409,10410,10412,10414,10417,10419],{"class":34,"line":78},[32,10411,8226],{"class":45},[32,10413,10385],{"class":53},[32,10415,10416],{"class":49}," \"...web\"",[32,10418,9596],{"class":49},[32,10420,10421],{"class":38},"      # web 及其被依赖者\n",[369,10423,10425],{"id":10424},"npmrc-常用",".npmrc 常用",[22,10427,10429],{"className":5856,"code":10428,"language":5858,"meta":27,"style":27},"shamefully-hoist=true             # 兼容老包（临时用）\nstrict-peer-dependencies=false\nauto-install-peers=true\nnode-linker=hoisted               # 扁平常见兼容方案\n",[29,10430,10431,10436,10441,10446],{"__ignoreMap":27},[32,10432,10433],{"class":34,"line":35},[32,10434,10435],{},"shamefully-hoist=true             # 兼容老包（临时用）\n",[32,10437,10438],{"class":34,"line":42},[32,10439,10440],{},"strict-peer-dependencies=false\n",[32,10442,10443],{"class":34,"line":63},[32,10444,10445],{},"auto-install-peers=true\n",[32,10447,10448],{"class":34,"line":78},[32,10449,10450],{},"node-linker=hoisted               # 扁平常见兼容方案\n",[17,10452,10454],{"id":10453},"十一常见问题","十一、常见问题",[369,10456,10458,10459,10462],{"id":10457},"_1-err_ossl_evp_unsupportednode-17","1. ",[29,10460,10461],{},"ERR_OSSL_EVP_UNSUPPORTED","（Node 17+）",[13,10464,10465],{},"老项目 + 新 Node，OpenSSL 3 引起。",[22,10467,10469],{"className":24,"code":10468,"language":26,"meta":27,"style":27},"export NODE_OPTIONS=--openssl-legacy-provider\n# 或降级 Node 16\n",[29,10470,10471,10483],{"__ignoreMap":27},[32,10472,10473,10475,10478,10480],{"class":34,"line":35},[32,10474,6854],{"class":279},[32,10476,10477],{"class":286}," NODE_OPTIONS",[32,10479,6860],{"class":279},[32,10481,10482],{"class":286},"--openssl-legacy-provider\n",[32,10484,10485],{"class":34,"line":42},[32,10486,10487],{"class":38},"# 或降级 Node 16\n",[369,10489,10491,10492,10495],{"id":10490},"_2-eacces-权限错误","2. ",[29,10493,10494],{},"EACCES"," 权限错误",[13,10497,10498,10501],{},[717,10499,10500],{},"别用 sudo","，改 npm 全局目录：",[22,10503,10505],{"className":24,"code":10504,"language":26,"meta":27,"style":27},"mkdir -p ~\u002F.npm-global\nnpm config set prefix '~\u002F.npm-global'\necho 'export PATH=~\u002F.npm-global\u002Fbin:$PATH' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n",[29,10506,10507,10516,10530,10542],{"__ignoreMap":27},[32,10508,10509,10511,10513],{"class":34,"line":35},[32,10510,3355],{"class":45},[32,10512,1494],{"class":53},[32,10514,10515],{"class":49}," ~\u002F.npm-global\n",[32,10517,10518,10520,10522,10524,10527],{"class":34,"line":42},[32,10519,8024],{"class":45},[32,10521,50],{"class":49},[32,10523,2885],{"class":49},[32,10525,10526],{"class":49}," prefix",[32,10528,10529],{"class":49}," '~\u002F.npm-global'\n",[32,10531,10532,10534,10537,10540],{"class":34,"line":63},[32,10533,6846],{"class":3324},[32,10535,10536],{"class":49}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'",[32,10538,10539],{"class":279}," >>",[32,10541,6930],{"class":49},[32,10543,10544,10546],{"class":34,"line":78},[32,10545,6927],{"class":3324},[32,10547,6930],{"class":49},[369,10549,10551,10552,10555],{"id":10550},"_3-peer-dep-冲突npm-7","3. ",[29,10553,10554],{},"peer dep"," 冲突（npm 7+）",[22,10557,10559],{"className":24,"code":10558,"language":26,"meta":27,"style":27},"npm install --legacy-peer-deps    # 按 npm 6 行为忽略 peer 冲突\nnpm install --force               # 强制（危险）\n",[29,10560,10561,10573],{"__ignoreMap":27},[32,10562,10563,10565,10567,10570],{"class":34,"line":35},[32,10564,8024],{"class":45},[32,10566,2945],{"class":49},[32,10568,10569],{"class":53}," --legacy-peer-deps",[32,10571,10572],{"class":38},"    # 按 npm 6 行为忽略 peer 冲突\n",[32,10574,10575,10577,10579,10581],{"class":34,"line":42},[32,10576,8024],{"class":45},[32,10578,2945],{"class":49},[32,10580,1324],{"class":53},[32,10582,10583],{"class":38},"               # 强制（危险）\n",[369,10585,10587],{"id":10586},"_4-安装慢","4. 安装慢",[13,10589,10590],{},"先换源（见第一节）。如果还慢，看是不是在下载 binary：",[22,10592,10594],{"className":24,"code":10593,"language":26,"meta":27,"style":27},"npm install --verbose 2>&1 | grep -i \"http\"\n",[29,10595,10596],{"__ignoreMap":27},[32,10597,10598,10600,10602,10605,10607,10609,10611,10613],{"class":34,"line":35},[32,10599,8024],{"class":45},[32,10601,2945],{"class":49},[32,10603,10604],{"class":53}," --verbose",[32,10606,7407],{"class":279},[32,10608,3126],{"class":279},[32,10610,3129],{"class":45},[32,10612,704],{"class":53},[32,10614,10615],{"class":49}," \"http\"\n",[13,10617,10618],{},"看到下载 electron \u002F puppeteer 之类的，就要配对应的 binary 镜像。",[369,10620,10622],{"id":10621},"_5-幽灵依赖","5. 幽灵依赖",[13,10624,10625,10626,10628],{},"代码用了没在 ",[29,10627,9415],{}," 里声明的包（因为被提升到顶层才碰巧能用）。",[13,10630,10631,10634,10635,2443,10638,10640],{},[717,10632,10633],{},"根治","：用 pnpm。",[717,10636,10637],{},"缓解",[29,10639,9153],{}," 核对，把用到的都显式声明。",[369,10642,10644],{"id":10643},"_6-ci-报-lock-不一致","6. CI 报 lock 不一致",[13,10646,10647,10648,2261,10650,10653,10654,10656,10657,10659,10660,10663],{},"用 ",[29,10649,9408],{},[29,10651,10652],{},"pnpm install --frozen-lockfile"," 时，",[29,10655,9415],{}," 与 lock 必须同步。本地改完 ",[29,10658,9415],{}," 一定要重跑一次 ",[29,10661,10662],{},"install"," 让 lock 更新，再提交。",[369,10665,10667],{"id":10666},"_7-强制项目使用某个包管理器","7. 强制项目使用某个包管理器",[22,10669,10671],{"className":3032,"code":10670,"language":3034,"meta":27,"style":27},"{\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\"\n  }\n}\n",[29,10672,10673,10677,10684,10694,10698],{"__ignoreMap":27},[32,10674,10675],{"class":34,"line":35},[32,10676,3041],{"class":286},[32,10678,10679,10682],{"class":34,"line":42},[32,10680,10681],{"class":3046},"  \"scripts\"",[32,10683,9685],{"class":286},[32,10685,10686,10689,10691],{"class":34,"line":63},[32,10687,10688],{"class":3046},"    \"preinstall\"",[32,10690,9693],{"class":286},[32,10692,10693],{"class":3055},"\"npx only-allow pnpm\"\n",[32,10695,10696],{"class":34,"line":78},[32,10697,9721],{"class":286},[32,10699,10700],{"class":34,"line":85},[32,10701,3088],{"class":286},[369,10703,10705,10706,10709],{"id":10704},"_8-npm-audit-fix-force-引入-breaking-change","8. ",[29,10707,10708],{},"npm audit fix --force"," 引入 breaking change",[13,10711,10712,10715],{},[29,10713,10714],{},"--force"," 会跨越主版本升级。先看不 force 能修多少：",[22,10717,10719],{"className":24,"code":10718,"language":26,"meta":27,"style":27},"npm audit\nnpm audit fix\nnpm audit --production            # 只看生产依赖\n",[29,10720,10721,10728,10737],{"__ignoreMap":27},[32,10722,10723,10725],{"class":34,"line":35},[32,10724,8024],{"class":45},[32,10726,10727],{"class":49}," audit\n",[32,10729,10730,10732,10734],{"class":34,"line":42},[32,10731,8024],{"class":45},[32,10733,10166],{"class":49},[32,10735,10736],{"class":49}," fix\n",[32,10738,10739,10741,10743,10746],{"class":34,"line":63},[32,10740,8024],{"class":45},[32,10742,10166],{"class":49},[32,10744,10745],{"class":53}," --production",[32,10747,10748],{"class":38},"            # 只看生产依赖\n",[17,10750,10752],{"id":10751},"十二安全审计","十二、安全审计",[22,10754,10756],{"className":24,"code":10755,"language":26,"meta":27,"style":27},"npm audit\nyarn audit\npnpm audit\n",[29,10757,10758,10764,10770],{"__ignoreMap":27},[32,10759,10760,10762],{"class":34,"line":35},[32,10761,8024],{"class":45},[32,10763,10727],{"class":49},[32,10765,10766,10768],{"class":34,"line":42},[32,10767,8184],{"class":45},[32,10769,10727],{"class":49},[32,10771,10772,10774],{"class":34,"line":63},[32,10773,8226],{"class":45},[32,10775,10727],{"class":49},[2279,10777],{},[17,10779,2283],{"id":2283},[2285,10781,10782,10789,10796,10803],{},[2288,10783,10784,10785],{},"npm 文档：",[2292,10786,10787],{"href":10787,"rel":10788,"target":2299},"https:\u002F\u002Fdocs.npmjs.com\u002F",[2296,2297,2298],[2288,10790,10791,10792],{},"yarn v1：",[2292,10793,10794],{"href":10794,"rel":10795,"target":2299},"https:\u002F\u002Fclassic.yarnpkg.com\u002F",[2296,2297,2298],[2288,10797,10798,10799],{},"pnpm：",[2292,10800,10801],{"href":10801,"rel":10802,"target":2299},"https:\u002F\u002Fpnpm.io\u002Fzh\u002F",[2296,2297,2298],[2288,10804,7924,10805],{},[2292,10806,7927],{"href":7927,"rel":10807,"target":2299},[2296,2297,2298],[1977,10809,10810],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}",{"title":27,"searchDepth":42,"depth":42,"links":10812},[10813,10823,10832,10833,10837,10838,10842,10846,10847,10851,10857,10871,10872],{"id":2368,"depth":42,"text":2369,"children":10814},[10815,10816,10817,10818,10819,10820,10821,10822],{"id":8013,"depth":63,"text":8014},{"id":8120,"depth":63,"text":8121},{"id":8247,"depth":63,"text":8248},{"id":8324,"depth":63,"text":8325},{"id":8374,"depth":63,"text":8375},{"id":8420,"depth":63,"text":8421},{"id":8465,"depth":63,"text":8466},{"id":8524,"depth":63,"text":8525},{"id":8606,"depth":42,"text":8607,"children":10824},[10825,10826,10827,10828,10829,10830,10831],{"id":8621,"depth":63,"text":8622},{"id":8687,"depth":63,"text":8688},{"id":8721,"depth":63,"text":8722},{"id":8755,"depth":63,"text":8756},{"id":8785,"depth":63,"text":8786},{"id":8828,"depth":63,"text":8829},{"id":8849,"depth":63,"text":8850},{"id":8912,"depth":42,"text":8913},{"id":9226,"depth":42,"text":9227,"children":10834},[10835,10836],{"id":9288,"depth":63,"text":9288},{"id":9370,"depth":63,"text":9371},{"id":9419,"depth":42,"text":9420},{"id":9496,"depth":42,"text":9497,"children":10839},[10840,10841],{"id":9500,"depth":63,"text":9500},{"id":9581,"depth":63,"text":9581},{"id":9658,"depth":42,"text":9659,"children":10843},[10844,10845],{"id":9662,"depth":63,"text":9663},{"id":9825,"depth":63,"text":9825},{"id":9896,"depth":42,"text":9897},{"id":10055,"depth":42,"text":10056,"children":10848},[10849,10850],{"id":10059,"depth":63,"text":10059},{"id":10142,"depth":63,"text":10142},{"id":10187,"depth":42,"text":10188,"children":10852},[10853,10854,10855,10856],{"id":10191,"depth":63,"text":10191},{"id":10214,"depth":63,"text":10142},{"id":10335,"depth":63,"text":10335},{"id":10424,"depth":63,"text":10425},{"id":10453,"depth":42,"text":10454,"children":10858},[10859,10861,10863,10865,10866,10867,10868,10869],{"id":10457,"depth":63,"text":10860},"1. ERR_OSSL_EVP_UNSUPPORTED（Node 17+）",{"id":10490,"depth":63,"text":10862},"2. EACCES 权限错误",{"id":10550,"depth":63,"text":10864},"3. peer dep 冲突（npm 7+）",{"id":10586,"depth":63,"text":10587},{"id":10621,"depth":63,"text":10622},{"id":10643,"depth":63,"text":10644},{"id":10666,"depth":63,"text":10667},{"id":10704,"depth":63,"text":10870},"8. npm audit fix --force 引入 breaking change",{"id":10751,"depth":42,"text":10752},{"id":2283,"depth":42,"text":2283},{},"\u002Fnode-package-managers-memo-2026-09-25",{"title":8003,"description":8008},"node-package-managers-memo-2026-09-25",[8024,8184,8226,10878,2356],"包管理","JkdpCYfPGT7iWzYMx8X-4vzuHBW9MP1FBF9nLBNfuew",1794733996652]