操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    件(F)-新建(N)... Ctrl+N

    文件(F)-打開(O)... Ctrl+O

    文件(F)-保存(S) Ctrl+S

    文件(F)-另存為(A)... Ctrl+推移+A

    文件(F)-繪圖(L)... Ctrl+P

    文件(F)-導(dǎo)入(M)-部件(P)... Ctrl+1

    文件(F)-導(dǎo)入(M)-I-DEAS... Ctrl+7

    文件(F)-導(dǎo)入(M)-Parasolid... Ctrl+2

    文件(F)-導(dǎo)入(M)-NX-2D... Ctrl+8

    文件(F)-導(dǎo)入(M)-CGM... Ctrl+9

    文件(F)-導(dǎo)入(M)-STL.. Ctrl+0

    文件(F)-導(dǎo)入(M)-IGES.. Ctrl+3

    文件(F)-導(dǎo)入(M)-Step203... Ctrl+4

    文件(F)-導(dǎo)入(M)-DXF/DWG(&D)... Ctrl+5

    文件(F)-導(dǎo)出(E)-部件(P)... 推移+1

    文件(F)-導(dǎo)出(E)-Parasolid... 推移+2

    文件(F)-導(dǎo)出(E)-CGM... 推移+9

    文件(F)-導(dǎo)出(E)-JPEG... 推移+8

    文件(F)-導(dǎo)出(E)-TIFF... 推移+7

    文件(F)-導(dǎo)出(E)-IGES.. 推移+3

    文件(F)-導(dǎo)出(E)-Step203... 推移+4

    文件(F)-導(dǎo)出(E)-DXF/DWG... 推移+5

    文件(F)-導(dǎo)出(E)-2D 轉(zhuǎn)換(2)... 推移+6

    文件(F)-執(zhí)行(T)-圖形交互編程(Grip)... Ctrl+G

    文件(F)-執(zhí)行(T)-Grip 調(diào)試(D)... Ctrl+推移+G

    文件(F)-執(zhí)行(T)-NX 打開... Ctrl+U

    編輯(E)-撤銷列表(U)-1 進(jìn)入“建模” Ctrl+Z

    編輯(E)-粘貼(P) Ctrl+V

    編輯(E)-刪除(D)... Ctrl+D Delete

    編輯(E)-選擇(L)-全選(A) Ctrl+A

    編輯(E)-隱藏(B)-隱藏(B)... Ctrl+B

    編輯(E)-隱藏(B)-互換顯示與隱藏(R) Ctrl+推移+B

    編輯(E)-隱藏(B)-不隱藏所選的(S)... Ctrl+推移+K

    編輯(E)-隱藏(B)-顯示部件中所有的(A) Ctrl+推移+U

    編輯(E)-變換(N)... Ctrl+T

    編輯(E)-對象顯示(J)... Ctrl+J

    編輯(E)-曲線(V)-全部(A)... 推移+E

    編輯(E)-曲線(V)-修整(T)... 推移+T

    編輯(E)-曲線(V)-裁剪角(C)... 推移+C

    編輯(E)-曲線(V)-分割(D)... 推移+D

    編輯(E)-曲線(V)-Curve Length... 推移+L

    編輯(E)-特征(F)-去除參數(shù)(V)... 推移+V

    編輯(E)-曲面(R)-擴(kuò)大(A)... Alt+推移+L

    編輯(E)-面(A)... G

    視圖(V)-操作(O)-縮放(Z)... Ctrl+推移+Z

    視圖(V)-操作(O)-旋轉(zhuǎn)(R)... Ctrl+R

    視圖(V)-操作(O)-截面(C)... Ctrl+H

    視圖(V)-布局(L)-新建(N)... Ctrl+推移+N

    視圖(V)-布局(L)-打開(O)... Ctrl+推移+O

    視圖(V)-布局(L)-充滿所有視圖(F) Ctrl+推移+F

    視圖(V)-可視化(V)-高質(zhì)量圖片(H)... Ctrl+推移+H

    視圖(V)-信息窗口(I) F4

    視圖(V)-重設(shè)方位(E) Ctrl+F8

    插入(S)-基準(zhǔn)/點(diǎn)(D)-基準(zhǔn)平面(D)... D

    插入(S)-基準(zhǔn)/點(diǎn)(D)-點(diǎn)(P)... P

    插入(S)-基準(zhǔn)/點(diǎn)(D)-點(diǎn)集(S)... Q

    插入(S)-曲線(C)-弧/圓(C)... Ctrl+C

    插入(S)-曲線(C)-基本曲線(B)... B

    插入(S)-曲線(C)-矩形(R)... 推移+R

    插入(S)-曲線(C)-多邊形(P)... 推移+Y

    插入(S)-曲線(C)-螺旋(X)... 推移+H

    插入(S)-曲線(C)-規(guī)律曲線(W)... 推移+W

    插入(S)-曲線(C)-樣條(S)... S

    插入(S)-曲線中的一條曲線(F)-偏置(O)... 推移+O

    插入(S)-曲線中的一條曲線(F)-在面上偏置... 推移+F

    插入(S)-曲線中的一條曲線(F)-橋接(B)... 推移+B

    插入(S)-曲線中的一條曲線(F)-簡化(S)... 推移+M

    插入(S)-曲線中的一條曲線(F)-合并(J)... 推移+J

    插入(S)-曲線中的一條曲線(F)-投影(P)... 推移+P

    插入(S)-曲線中的一條曲線(F)-組合投影(C)... 推移+N

    插入(S)-曲線中的一條曲線(F)-纏繞/展開(W)... 推移+Q

    插入(S)-體的曲線(U)-相交(I)... 推移+I

    插入(S)-體的曲線(U)-截面(S)... 推移+S

    插入(S)-體的曲線(U)-抽取(E)... 推移+X

    插入(S)-設(shè)計(jì)特征(E)-拉伸(E)... X

    插入(S)-設(shè)計(jì)特征(E)-回轉(zhuǎn)... V

    插入(S)-設(shè)計(jì)特征(E)-長方體(K)... K

    插入(S)-設(shè)計(jì)特征(E)-圓柱體(C)... Y

    插入(S)-設(shè)計(jì)特征(E)-圓錐(O)... O

    插入(S)-設(shè)計(jì)特征(E)-球(S)... R

    插入(S)-設(shè)計(jì)特征(E)-孔(H)... Alt+H

    插入(S)-設(shè)計(jì)特征(E)-圓臺(B)... Alt+B

    插入(S)-設(shè)計(jì)特征(E)-腔體(P)... Alt+K

    插入(S)-設(shè)計(jì)特征(E)-凸墊(A)... Alt+D

    插入(S)-設(shè)計(jì)特征(E)-Emboss... Alt+Z

    插入(S)-設(shè)計(jì)特征(E)-鍵槽(L)... Alt+L

    插入(S)-設(shè)計(jì)特征(E)-溝槽(G)... Alt+G

    插入(S)-關(guān)聯(lián)復(fù)制(A)-抽取(E)... Alt+X

    插入(S)-關(guān)聯(lián)復(fù)制(A)-引用(I)... I

    插入(S)-聯(lián)合體(B)-并(U)... Alt+U

    插入(S)-聯(lián)合體(B)-差(S)... Alt+S

    插入(S)-聯(lián)合體(B)-相交(I)... Alt+I

    插入(S)-聯(lián)合體(B)-縫合(W)... E

    插入(S)-Trim-Divide Face... Alt+J

    插入(S)-Trim-合并面(J)... Alt+Q

    插入(S)-Trim-Trim Body... T

    插入(S)-Trim-分割(P)... Alt+P

    插入(S)-Trim-修整片體(R)... Alt+推移+T

    插入(S)-Offset/Scale-Offset Surface... Alt+V

    插入(S)-Offset/Scale-偏置面(F)... Alt+O

    插入(S)-Offset/Scale-比例(S)... Alt+A

    插入(S)-Offset/Scale-加厚片體(T)... F2

    插入(S)-Offset/Scale-Shell... H

    插入(S)-Offset/Scale-包含幾何體(G)... F3

    插入(S)-細(xì)節(jié)特征(L)-邊倒圓(E)... Alt+E

    插入(S)-細(xì)節(jié)特征(L)-面倒圓(F)... Alt+F

    插入(S)-細(xì)節(jié)特征(L)-軟倒圓(S)... Alt+推移+F

    插入(S)-細(xì)節(jié)特征(L)-橋接(B)... Alt+推移+B

    插入(S)-細(xì)節(jié)特征(L)-倒角(C)... Alt+C

    插入(S)-細(xì)節(jié)特征(L)-草圖(T)... Alt+T

    插入(S)-曲面(R)-延伸(X)... Alt+推移+X

    插入(S)-曲面(R)-由四點(diǎn)決定的曲面(4)... Alt+推移+4

    插入(S)-曲面(R)-通過點(diǎn)(H)... Alt+推移+P

    插入(S)-網(wǎng)格曲面(M)-直紋面(R)... L

    插入(S)-網(wǎng)格曲面(M)-通過曲線(T)... U

    插入(S)-網(wǎng)格曲面(M)-通過曲線網(wǎng)格(M)... M

    插入(S)-網(wǎng)格曲面(M)-1x1... Alt+1

    插入(S)-網(wǎng)格曲面(M)-1x2... Alt+2

    插入(S)-網(wǎng)格曲面(M)-2x0... Alt+3

    插入(S)-網(wǎng)格曲面(M)-2x2... Alt+4

    插入(S)-網(wǎng)格曲面(M)-nxn... Alt+5

    插入(S)-網(wǎng)格曲面(M)-截面(S)... Alt+推移+S

    插入(S)-網(wǎng)格曲面(M)-N 邊表面(I)... Alt+推移+N

    插入(S)-掃描(W)-掃描(S)... W

    插入(S)-掃描(W)-沿導(dǎo)引線掃描(G)... Alt+W

    插入(S)-彎邊曲面(G)-按規(guī)律延伸(L)... Alt+推移+W

    插入(S)-直接建模(I)-替換面(R)... F

    格式(R)-層的設(shè)置(S)... Ctrl+L

    格式(R)-在視圖中可見(V)... Ctrl+推移+V

    格式(R)-WCS-原點(diǎn)(O)... Alt+0

    格式(R)-WCS-旋轉(zhuǎn)(R)... Alt+9

    格式(R)-WCS-方位(N)... Alt+8

    格式(R)-WCS-顯示(P) Alt+7

    格式(R)-WCS-保存(S) Alt+6

    工具(T)-表達(dá)式(X)... Ctrl+E

    工具(T)-日記(J)-播放(P)... Alt+F8

    工具(T)-日記(J)-編輯(E) Alt+F11

    工具(T)-宏(R)-開始記錄(R)... Ctrl+推移+R

    工具(T)-宏(R)-回放(P)... Ctrl+推移+P

    工具(T)-宏(R)-步長(S)... Ctrl+推移+S

    信息(I)-對象(O)... Ctrl+I

    信息(I)-點(diǎn)(P)... C

    分析(L)-距離(D).. N

    分析(L)-角度(A)... A

    分析(L)-曲線(C)-Refresh Curvature Graphs Ctrl+推移+C

    分析(L)-簡單干涉(I)... Ctrl+X

    預(yù)設(shè)置(P)-對象(O)... Ctrl+推移+J

    預(yù)設(shè)置(P)-選擇(E)... Ctrl+推移+T

    應(yīng)用(N)-建模... Ctrl+M

    應(yīng)用(N)-外觀造型設(shè)計(jì)(T)...

    應(yīng)用(N)-制圖(D)... Ctrl+推移+D

    應(yīng)用(N)-加工(N)... Ctrl+Alt+M

    應(yīng)用(N)-裝配(L) Ctrl+Alt+W

    應(yīng)用(N)-基礎(chǔ)環(huán)境(G)... Ctrl+W

    幫助(H)-在線幫助(C)... F1

    刷新(S) F5

    適合窗口(F) Ctrl+F

    縮放(Z) F6

    旋轉(zhuǎn)(O) F7

    視圖方向(R)-正二測視圖(T) Home

    視圖方向(R)-正等測視圖(I) End

    視圖方向(R)-俯視圖(O) Ctrl+Alt+T

    視圖方向(R)-前視圖(F) Ctrl+Alt+F

    視圖方向(R)-右視圖(R) Ctrl+Alt+R

    視圖方向(R)-左視圖(L) Ctrl+Alt+L

    捕捉視圖(N) F8

    1. 變量

    普通加工程序直接用數(shù)值指定G代碼和移動距離;例如,GO1和X100.0。使用用戶宏程序時,數(shù)值可以直接指定或用變量指定。當(dāng)用變量時,變量值可用程序或用MDI面板上的操作改變。

    #1=#2+100

    G01 X#1 F300

    (1)變量的表示

    計(jì)算機(jī)允許使用變量名,用戶宏程序不行。變量用變量符號(#)和后面的變量號指定。

    例如:#1

    表達(dá)式可以用于指定變量號。此時,表達(dá)式必須封閉在括號中。

    例如:#[#1+#2-12]

    (2)變量的類型

    變量根據(jù)變量號可以分成四種類型:

    1)#0 空變量,該變量總是空,沒有值能賦給該變量。

    2)#1-#33 局部變量,局部變量只能用在宏程序中存儲數(shù)據(jù),例如,運(yùn)算結(jié)果。當(dāng)斷電時,局部變量被初始化為空。調(diào)用宏程序時,自變量對局部變量賦值。

    3)#100-#199、#500-#999 公共變量,公共變量在不同的宏程序中的意義相同。當(dāng)斷電時,變量#100-#199初始化為空。變量#500-#999的數(shù)據(jù)保存,即使斷電也不丟失。

    4)#1000--- 系統(tǒng)變量。系統(tǒng)變量用于讀和寫CNC運(yùn)行時各種數(shù)據(jù)的變化,例如,刀具的當(dāng)前位置,補(bǔ)償值。

    (3)變量值的范圍

    局部變量和公共變量可以有0值或下面范圍中的值:

    -1047到-10-29或-10-2到-1047,如果計(jì)算結(jié)果超出有效范圍,則發(fā)出P/S報警NO.111。

    (4)小數(shù)點(diǎn)的省略

    當(dāng)在程序中定義變量值時,小數(shù)點(diǎn)可以省略。

    例:當(dāng)定義#1=123;變量#1的實(shí)際值是123.000。

    (5)變量的引用

    為在程序中使用變量值,指定后跟變量號的地址。當(dāng)用表達(dá)式指定變量時,要把表達(dá)式放在括號中。

    例如:G01X[#1+#2]F#3;

    被引用變量的值根據(jù)地址的最小設(shè)定單位自動地舍入。

    例如:當(dāng)G00X#/;以1/1000mm的單位執(zhí)行時,CNC把123456賦值給變量#1,實(shí)際指令值為G00X12346.

    改變引用變量的值的符號,要把負(fù)號(-)放在#的前面。

    例如:G00X-#1

    當(dāng)引用未定義的變量時,變量及地址都被忽略。

    例如:當(dāng)變量#1的值是0,并且變量#2的值是空時,G00X#1 Y#2的執(zhí)行結(jié)果為G00X0。

    (6)雙軌跡(雙軌跡控制)的公共變量

    對雙軌跡控制,系統(tǒng)為每一軌跡都提供了單獨(dú)的宏變量,但是,根據(jù)參數(shù)N0.6036和6037的設(shè)定,某些公共變量可同時用于兩個軌跡。

    (7)未定義的變量

    當(dāng)變量值未定義時,這樣的變量成為空變量。變量#0總是空變量。它不能寫,只能讀。

    (a)引用

    當(dāng)引用一個未定義的變量時,地址本身也被忽略。

    當(dāng)#1=<空> 當(dāng)#1=0

    G90 X100 Y#1

    G90 X100 G90 X100 Y#1

    G90 X100 Y0

    (b) 運(yùn)算

    除了用<空>賦值以外,其余情況下<空>與0相同。

    當(dāng)#1=<空>時當(dāng)#1=0時

    #2=#1

    #2=<空> #2=#1

    #2=0

    #2=#*5

    #2=0 #2=#*5

    #2=0

    #2=#1+#1

    #2=0 #2=#1+#1

    #2=0

    (c)條件表達(dá)式

    EQ和NE中的<空>不同于0。

    當(dāng)#1=<空>時當(dāng)#1=0時

    #1EQ#0

    成立 #1EQ#0

    不成立

    #1 NE #0

    成立 #1 NE #0

    不成立

    #1 GE #0

    成立 #1 GE #0

    不成立

    #1 GT #0

    不成立 #1 GT #0

    不成立

    (8)限制

    程序號,順序號和任選程序段跳轉(zhuǎn)號不能使用變量。

    例:下面情況不能使用變量:

    0#1;

    /#2G00X100.0;

    N#3Y200.0;

    2. 算術(shù)和邏輯運(yùn)算

    下面列出的運(yùn)算可以在變量中執(zhí)行,表達(dá)式可包含常量和或由函數(shù)或運(yùn)算符組成的變量。表達(dá)式中的變量#j和#k可以用常數(shù)賦值。變量也可以用表達(dá)式賦值。

    定義:#i=#j

    加法:#i=#j+#k;

    減法:#i=#j-#k;

    乘法:#i=#j*#k;

    除法:#i=#j/#k;

    正弦:#i=SIN[#j];

    反正弦:#i=ASIN[#j];

    余弦:#i=COS[#j];

    反余弦:#i=ACOS[#j];

    正切:#i=TAN[#j];

    反正切:#i=ATAN[#j];

    角度以度數(shù)指定:90°30’表示為90.5度。

    平方根:#i=SQRT[#j];

    絕對值:#i=ABS[#j];

    舍入:#i=ROUNND[#j];

    上取整:#i=FIX[#j];

    下取整:#i=FUP[#j];

    自然對數(shù):#i=LN[#j];

    指數(shù)函數(shù) :#i=EXP[#j];

    或:#i-#jOR#k;

    異或:#i-#jXOR#k;

    與:#i-#jAND#k;

    邏輯運(yùn)算一位一位地按二進(jìn)制數(shù)執(zhí)行。

    從BCD轉(zhuǎn)為BIN

    從BIN轉(zhuǎn)為BCD #i=BIN[#j];

    #i=BCD[#j];

    用于與PMC的信號交換。

    說明:

    ● 角度單位

    函數(shù)SIN ,COS,ASIN,ACOS,TAN和ATAN的角度單位是度。如90°30’表示為90.5度。

    ● ARCSIN # i=ASIN[#j]

    1)取值范圍如下:

    當(dāng)參數(shù)(NO.6004#0)NAT位設(shè)為0時,270°~90°

    當(dāng)參數(shù)(NO.6004#0)NAT位設(shè)為1時,-90°~90°

    2)當(dāng)#j超出-1到1的范圍時,發(fā)出P/S報警NO.111.

    3)常數(shù)可替代變量#j

    ● ARCCOS #i=ACOS[#j]

    1) 取值范圍從180°~0°

    2) 當(dāng)#j超出-1到1的范圍時,發(fā)出P/S報警NO.111.

    3) 常數(shù)可替代變量#j

    ● ARCTAN #i=ATAN[#j]/ [#k]

    1) 指定兩個邊的長度,并用斜杠(/)分開

    2) 取值范圍如下:

    當(dāng)NAT位(參數(shù)NO.6004,#0)設(shè)為0時;0°到360°

    當(dāng)NAT位(參數(shù)NO.6004,#0)設(shè)為1時;-180°到180°

    3) 常數(shù)可替代變量#j

    ● 自然對數(shù) #i=LN[#j];

    1) 注意,相對誤差可能大于10-8.

    2) 當(dāng)反對數(shù)(#j)為0或小于0時,發(fā)出P/S報警NO.111.

    3) 常數(shù)可替代變量#j。

    ● 指數(shù)函數(shù) #i=EXP[#j]

    1) 注意,相對誤差可能大于10-8。

    2) 當(dāng)運(yùn)算結(jié)果超過3.65X1047(j大約是110)時,出現(xiàn)溢出并發(fā)出P/S報警NO.111.。

    3) 常數(shù)可替代變量#j。

    ● ROUND(舍入)函數(shù)

    1) 當(dāng)算術(shù)運(yùn)算或邏輯運(yùn)算指令I(lǐng)F或WHILE中包含ROUND函數(shù)時,則ROUND函數(shù)在第一個小數(shù)位置四舍五入. 當(dāng)執(zhí)行#1=ROUND[#2];此處#2=1.2345,變量1的值是1.0。

    2) 當(dāng)在NC語句地址中使用ROUND函數(shù)時,ROUND函數(shù)根據(jù)地址的最小設(shè)定單位將指定值四舍五入

    ● 上取整下取整

    CNC處理數(shù)值運(yùn)算時,若操作后產(chǎn)生的整數(shù)絕對值大于原數(shù)的絕對值時為上取整;若小于原數(shù)的絕對值為下整數(shù).對于負(fù)數(shù)的處理應(yīng)小心.

    ● 算術(shù)與邏輯運(yùn)算指令的縮寫

    程序中指令函數(shù)時,函數(shù)名的前兩個字符可以用于指定該函數(shù)。

    ROUND→RO

    FLX→FI

    ● 運(yùn)算次序

    1) 函數(shù)

    2) 乘和除運(yùn)算

    3) 加和減運(yùn)算

    ● 括號嵌套

    括號用于改變運(yùn)算次序,括號可以使用5級,包括函數(shù)內(nèi)部使用的括號.當(dāng)超過5級時,出現(xiàn)P/S報警NO.118.

    限制

    ● 括號 ([,])用于封閉表達(dá)式.注意,圓括號用于注釋。

    ● 運(yùn)算誤差 運(yùn)算時,可能出現(xiàn)誤差。

    注:相對誤差取決于運(yùn)算結(jié)果;使用兩類誤差的較小者;絕對誤差是常數(shù),而不管運(yùn)算結(jié)果;函數(shù)TAN執(zhí)行SIN/COS。

    如果SIN/COS或TAN函數(shù)的運(yùn)算結(jié)果小于10X10-8或由于運(yùn)算精度的限制不為0的話,設(shè)定參數(shù)NO.6004#1為1,則運(yùn)算結(jié)果可以規(guī)算為0。

    1) 變量值的精度約為8位十進(jìn)制數(shù).當(dāng)在加/減速中處理非常大的數(shù)時,將得不到期望的結(jié)果。

    2) 還應(yīng)該意識到,使用條件表達(dá)式EQ,NE,GE,GT.LE和LT時可能造成誤差。

    3) 使用下取整指令時應(yīng)小心。

    ● 除數(shù) 當(dāng)在除法或TAN[90]中指定為0的除數(shù)時,出現(xiàn)P/S報警NO.112

    3. 宏程序語句和NC語句

    下面的程序段為宏程序語句:

    ◆ 包含算術(shù)或邏輯運(yùn)算(=)的程序段.

    ◆ 包含控制語句的程序段

    ◆ 包含宏程序調(diào)用指令的程序段

    除了宏程序以外的任何程序段都為NC語句

    說明:

    ● 與NC語句的不同

    (1) 即使置于單程序段運(yùn)行方式,機(jī)床也不停止.但是,當(dāng)參數(shù)N0.6000#5SBM設(shè)定為1時,在單程序段方式中,機(jī)床停止.

    (2) 在刀具半徑補(bǔ)償方式中宏程序語句段不做為不移動程序段處理.

    ● 與宏程序語句有相同性質(zhì)的NC 語句

    (1) 含有子程序調(diào)用指令,但沒有除O,N或L地址之外的其它地址指令的NC語句其性質(zhì)與宏程序相同.

    (2) 不包含除ONP或L以外的指令地址的程序段其性質(zhì)與宏程序語句相同.

    作為一個強(qiáng)大的分布式版本控制系統(tǒng),Git 的誕生使得多個開發(fā)人員能夠在同一個項(xiàng)目上同時工作,也允許其跟蹤代碼的所有更改。它不僅改變了開發(fā)和協(xié)作的方式,還提升了軟件開發(fā)的效率、質(zhì)量和靈活性。掌握和熟練使用 Git 已成為現(xiàn)代軟件開發(fā)中不可或缺的一部分。

    那么,Git 究竟是怎么開發(fā)出來的?又有哪些趣事?本文作者 Nicholas Yan 進(jìn)行了詳細(xì)的回顧與分享。

    原文鏈接:https://graphite.dev/blog/bitkeeper-linux-story-of-git-creation


    作者 | Nicholas Yan 責(zé)編 | 夏萌
    譯者 | 彎月
    出品 | CSDN(ID:CSDNnews)

    2005年4月3日,Linus發(fā)布了Linux內(nèi)核的一個候選版本2.6.12-rc2。Linus表示,這個發(fā)布候選版本并不是太有趣,“diffstat(用于顯示文件差異統(tǒng)計(jì)信息的工具)輸出說明了一切:這是許多非常小的變更,融合了大量小的改進(jìn)和錯誤修復(fù)”,但這個版本成為了一個重要的標(biāo)志,因?yàn)檫@是最后一個Linux內(nèi)核的非Git版本。

    BitKeeper

    在使用BitKeeper(分布式版本控制系統(tǒng))之前的十年里,Linux內(nèi)核的版本控制一直是Linus自己。

    具體流程如下:開發(fā)人員將tarballs和補(bǔ)丁提交給幾個Linus信任的助手。助手們通過審核后,將補(bǔ)丁發(fā)送給Linus。最后,Linus親手將它們合并到自己的源代碼樹中,然后發(fā)布。

    當(dāng)然,Linus本人并不是一個“完美的版本控制服務(wù)”。1998年,知名程序員Larry McVoy通過Linux內(nèi)核郵件列表首次提出了BitKeeper的想法,他寫道:“很明顯,我們的領(lǐng)袖[Linus]目前有點(diǎn)超負(fù)荷,補(bǔ)丁可能會丟失。”

    盡管如今看來,這種手動的工作流程也未免太原始了,但在當(dāng)時,Linus認(rèn)為這種工作流程比其他選擇(主要是CVS)更好。

    后來,2007年Linus在Google發(fā)表了關(guān)于Git的演講,他提到了他的一個核心設(shè)計(jì)原則:“有什么是CVS不會做的?”當(dāng)然,這種厭惡自然也延伸到了SVN,同樣是在那次演講中,他笑著說:“觀眾席中有Subversion用戶嗎?你們可以離席了。我非常討厭CVS,所以我認(rèn)為Subversion是有史以來最沒有意義的項(xiàng)目。有一段時間里Subversion的整體口號是正確實(shí)現(xiàn)CVS。以這個口號為出發(fā)點(diǎn),你將一事無成。因?yàn)镃VS根本無法正確實(shí)現(xiàn)。”

    Linus認(rèn)為CVS的核心問題在于其集中化的性質(zhì)。由于Linux開發(fā)人員有數(shù)百名之多,所以Linus認(rèn)為每個人都擁有自己獨(dú)立的代碼庫副本至關(guān)重要,因?yàn)橹挥羞@樣他們才能在自己的分支上開發(fā)。這不僅對線下的工作有幫助,而且對內(nèi)部管理也很有幫助。每位開發(fā)人員都可以自由地向自己的代碼庫提交任何代碼,而且他們有機(jī)會說服社區(qū)他們的變更是有價值的。這樣可以防止擁有提交權(quán)限的貢獻(xiàn)者成為唯一的代碼庫的守門人。

    BitKeeper與CVS截然不同。在前面提到的1998年關(guān)于BitKeeper的介紹中,Larry McVoy勾勒了一個系統(tǒng),這個系統(tǒng)與如今我們所了解的源代碼控制非常相似,但在當(dāng)時卻完全不同。Larry McVoy寫道:

    支持所有這些操作的機(jī)制是一個分布式源代碼管理系統(tǒng)。該系統(tǒng)的主要特點(diǎn)是:

    • 每個人都有一個代碼庫(相比之下,CVS只有一個代碼庫)。

    • 代碼變更可以作為“超級補(bǔ)丁”(又稱為“變更集”)發(fā)送。變更集只是一個補(bǔ)丁文件,包含以下內(nèi)容:

    • 所有變更,按照修訂版本組織。

    • 一個標(biāo)識符,表示補(bǔ)丁應(yīng)該應(yīng)用在樹的哪個位置(如果你的更新落后于補(bǔ)丁發(fā)送者,則補(bǔ)丁將失敗)。

    • 所有變更的修訂歷史。

    • 元數(shù)據(jù),如路徑名變更,符號標(biāo)簽(如 alpha2 或 linux-2.1.133)等。

    • 一個名為“開發(fā)線”(LOD)的新概念。從邏輯上講,它是一個分支,但不需要在分支上。補(bǔ)丁可以(也將會)成為自己的 LOD。你可以在LOD上執(zhí)行“將此應(yīng)用于主分支”之類的操作。

    后來,Linus對BitKeeper表示了極大的贊賞,認(rèn)為BitKeeper改變了他的看法,而Git的靈感也來源于此:“BitKeeper不僅是第一個我覺得值得嘗試的版本控制系統(tǒng),也讓我明白了使用這類系統(tǒng)的意義以及如何正確使用這類系統(tǒng)。所以,從技術(shù)的角度來看,Git的許多方面雖然與BitKeeper有很大的區(qū)別(這是另一個設(shè)計(jì)目標(biāo),因?yàn)槲也幌M鸊it成為BitKeeper的克隆),但Git的許多工作流程都借鑒了BitKeeper。

    許可

    雖然Linus對BitKeeper的評價很高,但2002年在Linux內(nèi)部使用該工具的問題上,他的決定引發(fā)了Linux內(nèi)核郵件列表上大規(guī)模的爭論。

    爭論源自何處?Larry McVoy在構(gòu)建BitKeeper時,將其作為了一個商業(yè)的閉源項(xiàng)目(BitMover)。盡管人們能夠使用BitKeeper的免費(fèi)社區(qū)版本,但有一個限制性許可。

    根據(jù)維基百科記載:“社區(qū)版BitKeeper的許可允許開發(fā)人員在開源或自由軟件項(xiàng)目中免費(fèi)使用該工具,前提是這些開發(fā)人員在使用BitKeeper期間以及之后的一年內(nèi),不得參與競爭工具(如Concurrent Versions System、GNU arch、Subversion以及ClearCase)的開發(fā)。不論競爭工具是免費(fèi)還是專有的,這條限制都適用。”

    自由軟件的宣傳者Richard Stallman也發(fā)表了意見:“BitKeeper許可掌握了控制權(quán)。實(shí)際上是在說,‘你沒有權(quán)利使用BitKeeper,只有臨時的使用許可,而我們可以隨時撤銷這個許可。我們允許你使用BitKeeper,你應(yīng)該對此心存感激。不要做任何我們不喜歡的事情,否則我們可能會撤銷這些特權(quán)。自由軟件運(yùn)動的產(chǎn)生正是源自大家對這種許可的憤怒。’”

    但Linus采取了更務(wù)實(shí)的觀點(diǎn),從他的角度來看,他不過是需要最適合的工具,而不會在意這些工具源自何方。2007年,他曾表示:“盡管BitKeeper的許可有問題,但我仍然很高興,因?yàn)樘拱渍f,對于我而言,我做開源是因?yàn)槲艺J(rèn)為開源才是構(gòu)建軟件的唯一正確方式。但同時,我會使用最適合的工具,坦白說,BitKeeper就是我想要的工具。”

    然而,這段不安的聯(lián)姻無法持久。

    2005年,Linux內(nèi)核開發(fā)人員Andrew Tridgell違反了許可,并實(shí)施了逆向工程。他能夠提取BitKeeper代碼而不需要遵循BitKeeper許可。在Andrew Tridgell看來,這完全符合道德準(zhǔn)則:“我在編寫這個工具時根本沒有使用BitKeeper,因此從未受過BitKeeper許可的約束。”

    然而Larry McVoy對此有不同的看法。最初,Linus是站在他這邊的:

    “如果有人編寫一個免費(fèi)的替代品,Larry完全能接收……Larry不能接受的是,有人通過逆向工程他的代碼編寫了一個免費(fèi)的替代品。Larry的道德立場非常明確:‘你可以與我競爭,但你不能搭我的便車。自己解決問題,公平競爭。不要通過我的解決方案來競爭。’BitKeeper許可也正是為了表達(dá)這一點(diǎn):‘少來搭我的便車,你這個愛占便宜的家伙。’而我[Linus]無法反駁這一點(diǎn)。”

    Linus充當(dāng)了三個月的調(diào)停,但最終未能達(dá)成和解。

    2005年4月6日,Linus通過Linux內(nèi)核郵件列表發(fā)了一封主題為“內(nèi)核SCM長篇故事……”的郵件,開啟了一系列改變整個行業(yè)的事件:

    “可能部分人已知情,在過去的一兩個月里,我們一直在努力解決BitKeeper的使用沖突。但并未取得成功,因此內(nèi)核團(tuán)隊(duì)正在尋找替代方案。”

    他開玩笑地談到了歷史:“并不是說我選擇BitKeeper完全沒有沖突”,并強(qiáng)調(diào)了他對BitKeeper團(tuán)隊(duì)的感激之情。

    盡管如此,Linus回顧這段時光時仍然充滿了喜悅:

    事實(shí)上,BitKeeper從根本上改變了我們的做事方式。從細(xì)粒度的變更集跟蹤,到我最終信任次級維護(hù)者承擔(dān)更加重要的工作,我們無需再逐個出補(bǔ)丁。因此,與BitKeeper的三年合作絕對沒有浪費(fèi),我相信我們改進(jìn)了工作方式,而我正在考慮的事情之一就是確保這些方式持續(xù)有效。

    我想說,我個人對BitKeeper和Larry非常滿意。雖然我們的合作未能成功,但對Linux內(nèi)核的開發(fā)產(chǎn)生了重大影響。我們必須找到一套工具來代替BitKeeper的功能。

    Linus去度假

    雖然4月6日Linus通過郵件列表公布了雙方合作失敗的消息,但實(shí)際上他已經(jīng)展開了緊張的工作。就在2.6.12-rc2發(fā)布的三天前,他停止了Linux內(nèi)核的工作,并全力尋找BitKeeper的替代方案。

    Linus的目標(biāo)是“在兩周內(nèi)拿出可以投入使用的工具。”他在4月6日的郵件中宣布:“我將離線一周(你可以認(rèn)為‘Linus去度假了’),我請求繼續(xù)維護(hù)BitKeeper樹的人可以把結(jié)果作為(單獨(dú)的)補(bǔ)丁發(fā)送給我,因?yàn)槲乙残枰喜⒁徊糠执a。”

    很明顯,Linus的郵件透漏出了緊迫感,Linux內(nèi)核的下一個版本發(fā)布受阻,他必須盡快解決這個問題。

    他甚至在4月7日的一封郵件中提到了最壞打算,Linux內(nèi)核可能會轉(zhuǎn)而使用集中式的版本控制系統(tǒng):“請注意,我厭惡集中式的SCM模型,但如果事態(tài)嚴(yán)重,導(dǎo)致我們短時間內(nèi)(一個月或兩個月)無法并行合并代碼,我會通過一個信賴的網(wǎng)站搭建SVN之類的系統(tǒng),允許少數(shù)幾個人提交代碼,并將合并的工作分給幾個人,避免我自己成為瓶頸。”

    雖然事后來看,結(jié)果很明顯,但在當(dāng)時,根據(jù)這些郵件,編寫一個自定義的版本控制系統(tǒng)尚遙不可及。從4月6日的第一封郵件到4月12日的最后一封郵件,期間來往的郵件多達(dá)205封,他們討論了許多其他開源替代方案,比如Monotone、GNU arch、Bazaar-ng、Darcs,其中一些工具的創(chuàng)建者也參與進(jìn)來宣傳自己的項(xiàng)目。

    主要考慮因素,尤其是從Linus的角度來看,是每個工具的總體性能。總的來說,205封郵件涉及很多關(guān)于各種工具的性能和效率的討論。

    每個人心中最大的憂慮在于:現(xiàn)有工具中是否有一款適用于Linux內(nèi)核這種規(guī)模的項(xiàng)目?

    4月8日,距離最初的郵件發(fā)出過去了兩天,也就是Linus全身心投入工作5天后,他分享了一個最新消息:“由于monotone太慢,請各位在手頭的工作之余,試試看這個快速的挑戰(zhàn):kernel.org:/pub/linux/kernel/people/torvalds/。”

    Git誕生了。

    Git的第一行代碼

    有關(guān)Linus編寫初版Git僅用了兩周時間的傳聞,我們需要加上一則補(bǔ)充說明:如今我們所說的git主要是面向用戶的命令和整體工作流程,但當(dāng)時的目標(biāo)和任務(wù)有很大的不同,而且范圍非常有限。

    人們在郵件列表上爭論各種工具和方法的優(yōu)缺點(diǎn)時,有人粗略描述了他們的需求:“慢一點(diǎn)沒關(guān)系,只要不是慢得離譜。臨時解決方案的目的是建立線上的補(bǔ)丁工作流程。”

    初版的Git更像是一個內(nèi)容可尋址的文件系統(tǒng),算不上是一個完整的源代碼管理系統(tǒng)。Linus在另一封郵件中解釋說:

    (*) 我稱之為“提交”,但實(shí)際上更簡單。實(shí)際上表明“這是我的<目錄的當(dāng)前狀態(tài)>,我從<之前的目錄狀態(tài)集合>到達(dá)了這個狀態(tài),其原因是<**>”。

    順便說一下,我的設(shè)計(jì)意圖就在于此。“git”并不在意合并之類的操作。你可以使用任何SCM合并代碼。“git”所做的只是跟蹤目錄狀態(tài)(以及發(fā)展到該狀態(tài)的經(jīng)過),僅此而已。git并不會執(zhí)行合并操作,實(shí)際功能并不多。

    也就是說,你在Git存檔上“拉取”或“推送”時,就會得到所有目錄狀態(tài)的“聯(lián)合”。其中的HEAD就是指向“目錄狀態(tài)之海”的一個指針,但要想合并兩個目錄狀態(tài),就必須使用其他工具。

    雖然來往的郵件討論了各種工作流程和移動提交,但Linus構(gòu)建的客戶端并沒有考慮這些操作。

    Linus表示:“實(shí)際上‘Git’非常簡單,僅用了4天就編寫完成了。大部分時間實(shí)際上并不是在編寫代碼,而是思考數(shù)據(jù)結(jié)構(gòu)。”

    這是他后來反復(fù)提及的感受,有時會被斷章取義,但確實(shí)Linus所編寫代碼的新穎之處就在于數(shù)據(jù)結(jié)構(gòu)的選擇。Linus分享了前幾次提交,但沒有關(guān)于工作流程的討論。

    少數(shù)人主張使用SQL來存儲變更。Linus在后來的對話(很符合他個人的發(fā)言風(fēng)格)中表示:

    > 為什么后端使用了目錄樹,而沒有使用sql?

    因?yàn)閟ql很糟糕?

    我可以想出幾百萬種方法來降低速度。請你提出提高速度的方法。

    —— Linus

    但也有一些人看好Git,并渴望使用Git。就在Linus請求大家查看他的代碼的同一天,有幾個人發(fā)回了一些腳本,其中包含了在他的基礎(chǔ)之上構(gòu)建的其他功能。

    在Linus投入真正的工作兩周后,即2005年4月17日,他發(fā)了一封郵件:“第一次真正的內(nèi)核Git合并!”

    未來的發(fā)展

    二十年后,再讀當(dāng)初的那些郵件,最令我開心的部分是看到當(dāng)時的作者們未曾預(yù)料到的未來。

    一位用戶在評估源代碼控制替代產(chǎn)品monotone時表示:

    有點(diǎn)令人惱火的是,monotone似乎沒有網(wǎng)頁界面。我以前在追蹤bug時經(jīng)常使用BitKeeper的網(wǎng)頁界面,打開網(wǎng)頁瀏覽窗口查看文件的修訂版本和簽入評論等操作真的很快。你們知道是否有人正在開發(fā)這樣的界面嗎?

    當(dāng)時,源代碼控制和代碼審查的網(wǎng)頁界面剛剛開始流行,Google,Guido van Rossum 正在開發(fā)他們的第一個基于網(wǎng)頁的專用代碼審查工具M(jìn)ondrian。而在兩年后,GitHub成立了。

    有關(guān)性能的討論也充滿了諷刺意味。

    關(guān)于如果Git后端使用基于網(wǎng)絡(luò)的文件系統(tǒng)性能會如何的討論,如今已被顛覆。Google(FUSE)和Meta(EdenFS)這類的大公司擁有龐大的單一代碼庫,對于他們來說,這些基于網(wǎng)絡(luò)的源代碼控制文件系統(tǒng)是擴(kuò)展源代碼控制和構(gòu)建的關(guān)鍵。

    而最初激勵Linus編寫Git的核心問題(現(xiàn)有的版本控制替代產(chǎn)品無法支持Linux內(nèi)核代碼庫的大量歷史記錄和大規(guī)模的提交吞吐量)將在幾年后再次上演,Meta將主代碼庫從Git遷移出去,也出自同一個原因。

    當(dāng)然,當(dāng)時參與討論的各位并不知道這一切。

    Git的創(chuàng)建是為了打破Linux內(nèi)核發(fā)布的阻礙,并非在全球重新發(fā)明所有源代碼管理。Linus的評論強(qiáng)調(diào)他認(rèn)為源代碼管理是其他工具的領(lǐng)域,這些工具將成為Git的接口。

    在回顧歷史時,我們常常將其浪漫化為靈感突然迸發(fā)。然而,Git的創(chuàng)建說明了更加嚴(yán)酷的現(xiàn)實(shí):圍繞許可的分歧逐漸升級;打破阻礙的緊急備選方案的需求;多年的打磨和迭代并非源自發(fā)明者,而是由社區(qū)推動。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有