1.Rust Cargo使用指南 | 第八篇 | 依赖覆盖
2.swin transformerç解è¦ç¹
3.linuxä¸çpatchå½ä»¤
4.请问Linux中patch产生的源源码信息怎么看,+-是源源码什么意思?
5.å¦ä½ä½¿ç¨git åpatch
Rust Cargo使用指南 | 第八篇 | 依赖覆盖
依赖覆盖在本地开发中是常见的,通常是源源码为了在某个包发布到crates.io之前使用它。
通过多种引用方式引入一个包也是源源码一种依赖覆盖。
假设项目正在使用uuid依赖包,源源码但不幸地发现了一个bug。源源码掌上代理源码由于这个bug影响了使用,源源码无法等到官方提交新版本,源源码因此还是源源码自己修复为好。
为了修复bug,源源码需要将uuid的源源码源码克隆到本地,克隆到和项目同级的源源码小程序源码审核通过目录下。
修改项目的源源码Cargo.toml,添加以下内容以引入本地克隆的源源码版本。
这里使用自己修改过的源源码patch来覆盖来自crates.io的版本,由于克隆下来的uuid目录和项目同级,因此通过相对路径"../uuid"即可定位到。
在成功为uuid打了本地补丁后,尝试在项目下运行cargo build,但却报错了。
具体原因比较复杂,但仔细观察会发现克隆下来的uuid的版本是v1.0.0-alpha.1,然后本地引入的绿色能源码头形象uuid版本是0.8.2。根据crates.io的版本规则,这两者是不兼容的。
既然如此,先将"../uuid/Cargo.toml"中的version="1.0.0-alpha.1"修改为version="0.8.3",然后看看结果。
大家注意到最后一行了吗?成功使用本地的0.8.3版本的uuid作为最新的依赖,因此也侧面证明了补丁patch的版本也必须遵循相应的版本兼容规则。
如果修改后仍有问题,可以试试以下命令,指定版本进行更新。
修复bug后,主图选股源码可以提交pr给uuid,一旦pr被合并到了master分支,可以按照以下方式使用补丁。
等未来新的内容更新到crates.io后,可以移除这个补丁,直接更新[dependencies]中的uuid版本即可。
假设要为uuid包新增一个特性,并已经修改完毕,在本地测试过,并提交了相应的pr,下面来看看如何在它发布到crates.io之前继续使用。假溯源码燕窝标签
为了使用新加的特性,同时当该包在未来发布到crates.io后,可以自动使用crates.io上的新版本,而无需再使用patch补丁,可以这样修改Cargo.toml。
注意,将[dependencies]中的uuid版本提前修改为1.0.1,由于该版本在crates.io尚未发布,因此patch版本会被使用。
现在,项目是基于patch版本的uuid来构建,也就是从github的master分支中拉取最新的commit来构建。
一旦未来crates.io上有1.0.1版本,项目就会继续基于crates.io来构建,此时,patch就可以删除了。
假设项目A的依赖是B和uuid,而B的依赖也是uuid,此时可以配置A和B都使用来自github的patch版本。
如上所示,patch不仅仅对于my-binary项目有用,对于my-binary的依赖my-library来说,一样可以间接生效。
若要覆盖的依赖不是来自crates.io,就需要对[patch]做一些修改。
若要发布一个大版本2.0.0,可以将Cargo.toml修改如下。
此时2.0版本在crates.io上还不存在,因此使用了patch版本且指定了branch="2.0.0"。
这里需要注意,与之前的小版本不同,大版本的patch不会发生间接的传递。
在之前章节中介绍过如何使用package key来重命名依赖包,现在来看看如何使用它同时引入多个patch。
为了满足两个patch需求,可以使用如下内容的Cargo.toml。
第一行说明,第一个patch从官方仓库main分支的最新commit拉取,而第二则从我们自己的仓库拉取v2分支,同时将其重命名为serde2。
这样,在代码中就可以分别通过serde和serde2引用不同版本的依赖库了。
有时只是临时性地对一个项目进行处理,因此并不想去修改它的Cargo.toml,可以使用Cargo提供的路径覆盖方法。
与[patch]修改Cargo.toml不同,路径覆盖修改的是Cargo自身的配置文件$Home/.cargo/config.toml。
paths数组中的元素是一个包含Cargo.toml的目录(依赖包),在当前例子中,由于只有一个uuid,因此只需要覆盖它即可。
不推荐的[replace]已经被标记为deprecated,并将在未来被移除,请使用[patch]替代。
虽然不建议使用,但如果阅读其它项目时依然可能会碰到这种用法。
swin transformerç解è¦ç¹
è¿æ¯è·éçå类以ååå²æºç ä»ç»ï¼å¤§å®¶æéè¦å¯ä»¥åèä¸ä¸ï¼1ã Swin-Transformeråç±»æºç (å·²è·é)
2ã Swin-Transformeråå²æºç (å·²è·é)
3ã Swin-Unet(åå²æ¹ç¼)
æ们å设å¾çç大å°æ¯Ãçï¼çªå£å¤§å°æ¯åºå®çï¼7Ã7ãè¿éæ¯ä¸ªæ¹æ¡é½æ¯ä¸ä¸ªçªå£ï¼æ¯ä¸ªçªå£æ¯åºå®æ7Ã7个patchï¼ä½æ¯patchç大å°æ¯ä¸åºå®çï¼å®ä¼éçpatch mergingçæä½èåçååãæ¯å¦æ们çè¿å¿ï¼patch大å°æ¯4Ã4çï¼é£æä¹åæ8Ã8å¢ï¼æ们æå¨è¾¹4个çªå£çpatchæ¼å¨ä¸èµ·ï¼ç¸å½äºpatchæ©å¤§äº2Ã2åï¼ä»èå¾å°8Ã8大å°çpatchã
æ们åç°ç»è¿è¿ä¸ç³»åçæä½ä¹åï¼patchçæ°ç®å¨åå°ï¼æåæ´å¼ å¾åªæä¸ä¸ªçªå£ï¼7个patchãæ以æ们å¯ä»¥è®¤ä¸ºééæ ·æ¯æ让patchçæ°éåå°ï¼ä½æ¯patchç大å°å¨å大ã
è¿ä¾¿æ¯å¯¹ViTçä¸ä¸ªæ¹è¿ï¼ViTä»å¤´è³å°¾é½æ¯å¯¹å ¨å±åself-attentionï¼èswin-transformeræ¯ä¸ä¸ªçªå£å¨æ¾å¤§çè¿ç¨ï¼ç¶åself-attentionç计ç®æ¯ä»¥çªå£ä¸ºåä½å»è®¡ç®çï¼è¿æ ·ç¸å½äºå¼å ¥äºå±é¨èåçä¿¡æ¯ï¼åCNNçå·ç§¯è¿ç¨å¾ç¸ä¼¼ï¼å°±åæ¯CNNçæ¥é¿åå·ç§¯æ ¸å¤§å°ä¸æ ·ï¼è¿æ ·å°±åå°äºçªå£çä¸éåï¼åºå«å¨äºCNNå¨æ¯ä¸ªçªå£åçæ¯å·ç§¯ç计ç®ï¼æ¯ä¸ªçªå£æåå¾å°ä¸ä¸ªå¼ï¼è¿ä¸ªå¼ä»£è¡¨çè¿ä¸ªçªå£çç¹å¾ãèswin transformerå¨æ¯ä¸ªçªå£åçæ¯self-attentionç计ç®ï¼å¾å°çæ¯ä¸ä¸ªæ´æ°è¿ççªå£ï¼ç¶åéè¿patch mergingçæä½ï¼æçªå£åäºä¸ªå并ï¼å继ç»å¯¹è¿ä¸ªå并åççªå£åself-attentionç计ç®ã
å ¶å®è¿è¾¹å°æ°äºæä¸å°ä¸ï¼å 为æ们å°è±¡ä¸ééæ ·é½æ¯åCNNä¸æ ·ï¼ä¼åå°ï¼ä½æ¯swin transformer没æç»æ们åå°çæè§ãå ¶å®è¿å°±æ¯æåé没ç解å°ä½çé®é¢ï¼CNNå°æåï¼è®¾è®¡éå½ï¼æåä¸ä¸ªç¹å¾å¾çæåéæ¯å¯ä»¥æ¾å¤§å°æ´å¼ å¾çï¼swin transformeræåä¸ä¸ªstageä¹æ¯ä¸ä¸ªçªå£æ¶µçäºæ´å¼ å¾ã
Swin-transformeræ¯æä¹æå¤æ度éä½çå¢ï¼ Swin Transformer Blockè¿ä¸ªæ¨¡ååæ®éçtransformerçåºå«å°±å¨äºW-MSAï¼èå®å°±æ¯éä½å¤æ度计ç®ç大åè£ã
å ³äºå¤æ度ç计ç®ï¼æç®åçç»å¤§å®¶ä»ç»ä¸ä¸ï¼é¦å æ¯transformeræ¬èº«åºäºå ¨å±çå¤æ度计ç®ï¼è¿ä¸åå¿è®²èµ·æ¥æç¹å¤æï¼æå ´è¶£çåå¦æ们å¯ä»¥ä¼åä¸èµ·æ¢è®¨æ¨å¯¼è¿ç¨ãå¨è¿éï¼æ们å设已ç¥MSAçå¤æ度æ¯å¾å大å°çå¹³æ¹ï¼æ ¹æ®MSAçå¤æ度ï¼æ们å¯ä»¥å¾åºAçå¤æ度æ¯(3Ã3)²ï¼æåå¤æ度æ¯ãSwin transformeræ¯å¨æ¯ä¸ªlocal windows(红è²é¨å)计ç®self-attentionï¼æ ¹æ®MSAçå¤æ度æ们å¯ä»¥å¾åºæ¯ä¸ªçº¢è²çªå£çå¤æ度æ¯1Ã1çå¹³æ¹ï¼ä¹å°±æ¯1çå次æ¹ãç¶å9个çªå£ï¼è¿äºçªå£çå¤æ度å åï¼æåBçå¤æ度为9ã
W-MSAè½ç¶éä½äºè®¡ç®å¤æ度ï¼ä½æ¯ä¸éåçwindowä¹é´ç¼ºä¹ä¿¡æ¯äº¤æµï¼æ以æ³è¦çªå£ä¹é´çä¿¡æ¯ææ交æµï¼é£ä¹å°±å¯ä»¥æå·¦å¾æ¼åæå³å¾è¿æ ·ï¼ä½æ¯è¿å°±äº§çäºä¸ä¸ªé®é¢ï¼å¦æ¤æä½ï¼ä¼äº§çæ´å¤çwindowsï¼å¹¶ä¸å ¶ä¸ä¸é¨åwindowå°äºæ®éçwindowï¼æ¯å¦4个window -> 9个windowï¼windowsæ°éå¢å äºä¸åå¤ãè¿è®¡ç®éåä¸æ¥äºãå æ¤æ们æ两个ç®çï¼Windowsæ°éä¸è½å¤ï¼windowä¹é´ä¿¡æ¯å¾æ交æµã
æ们çå°ï¼åæ¥çå¾è¢«ååäº9个çªå£ï¼ä¸é´çåºåAå°±æ¯ä¿¡æ¯äº¤æµçè¯æãæ们å æå·¦ä¸é¨å(èè²ä»¥å¤ççªå£)移å¨å°å³ä¸ï¼ç¶ååç¨ååååçæ¹æ³å»åè¿ä¸ªå¾çï¼è¿æ¶ååºåA就被éåºæ¥äºï¼è¾¾å°äºæ们æ³è¦çææã
transformerçåºç°å¹¶ä¸æ¯ä¸ºäºæ¿ä»£CNNãå 为transformeræçCNN没æçåè½æ§ï¼å®ä¸ä» å¯ä»¥æåç¹å¾ï¼è¿å¯ä»¥åå¾å¤CNNåä¸å°çäºæ ï¼æ¯å¦å¤æ¨¡æèåãèswin transformerå°±æ¯ä¸ä¸ªè¶å¿ï¼å°CNNä¸transformeråèªçä¼å¿ææçç»åäºèµ·æ¥ãè¿æ¯ææ¶å¯¹å®çä¸äºç»èè¡¥å ãæè¿å¬è¯´MLPåºæ¥äºï¼è¿æ²¡æç»çï¼æ¶ä»£è¿å±æªå ä¹å¤ªå¿«äºï¼æéé对ViTæ¹è¿çæç« è¿æ²¡æåºå»ï¼å°±å·²ç»å¼å§è¦ç«ä¸ä½èäºã
å¸æå¯ä»¥å¸®å©å°å¤§å®¶ï¼å¦æä½ è§å¾è¿ç¯æç« å¯¹ä½ æä¸å®ç帮å©ï¼é£å°±ç¹ä¸ªèµæ¯æä¸ä¸å§ï¼å¦ææä»ä¹é®é¢çè¯ä¹å¯ä»¥å¨æç« ä¸é¢è¯è®ºï¼æ们ä¸èµ·äº¤æµè§£å³é®é¢ï¼
以ä¸æ¯ææææç« çç®å½ï¼å¤§å®¶å¦ææå ´è¶£ï¼ä¹å¯ä»¥åå¾æ¥ç
👉æ³å³è¾¹ï¼ æå¼å®ï¼ä¹è®¸ä¼çå°å¾å¤å¯¹ä½ æ帮å©çæç«
linuxä¸çpatchå½ä»¤
patchå½ä»¤ç¨äºä¸ºç¹å®è½¯ä»¶å æè¡¥ä¸ï¼è¯¥å½ä»¤ä½¿ç¨diffå½ä»¤å¯¹æºæ件è¿è¡æä½ã
æ ¼å¼ï¼patch [é项] [åå§æ件 [è¡¥ä¸æ件]]
常ç¨åæ°ï¼
-r æ¯ä¸ä¸ªéå½é项ï¼è®¾ç½®äºè¿ä¸ªé项ï¼diffä¼å°ä¸¤ä¸ªä¸åçæ¬æºä»£ç ç®å½ä¸çææ对åºæä»¶å ¨é¨é½è¿è¡ä¸æ¬¡æ¯è¾ï¼å æ¬åç®å½æ件ã
-N é项确ä¿è¡¥ä¸æ件å°æ£ç¡®å°å¤çå·²ç»å建æå é¤æ件çæ åµã
-u é项以ç»ä¸æ ¼å¼å建补ä¸æ件ï¼è¿ç§æ ¼å¼æ¯ç¼ºçæ ¼å¼æ´ç´§åäºã
-p0 é项ä»å½åç®å½æ¥æ¾ç®çæ件ï¼å¤¹ï¼(ç´æ¥ä½¿ç¨è¡¥ä¸æ件éé¢æå®çè·¯å¾)
-p1 é项忽ç¥æ第ä¸å±ç®å½ï¼ä»å½åç®å½æ¥æ¾(å»æè¡¥ä¸æ件æå®è·¯å¾æå·¦ç第1个'/'ååé¢ææå 容)ã
-E é项说æå¦æåç°äºç©ºæ件ï¼é£ä¹å°±å é¤å®
-R é项说æå¨è¡¥ä¸æ件ä¸çâæ°âæ件åâæ§âæ件ç°å¨è¦è°æ¢è¿æ¥äºï¼å®é ä¸å°±æ¯ç»æ°çæ¬æè¡¥ä¸ï¼è®©å®åæèçæ¬ï¼
示ä¾ï¼
1ãå个æ件
é¦å å°ä¸¤ä¸ªæ件çå 容æ¾ç¤ºå¦ä¸ï¼
$ cat test0
$ cat test1
*çæè¡¥ä¸ï¼
$ diff -uN test0 test1 >test1.patch
è¿æ ·å°éè¿æ¯è¾ï¼çætest1çè¡¥ä¸æ件ãè¿éé项u表示使ç¨åä¸æ ¼å¼è¾åºè¿æ ·äº§ççè¾åºä¾¿äºé 读æäºä¿®æ¹ï¼N表示æä¸åå¨çæ件çåemptyç.å°±ç®æ件test0ä¸åå¨ï¼ä¹ä¼çæè¡¥ä¸ã
*ætest0éè¿æè¡¥ä¸åætest1æ件ï¼
$ patch -p0 <test1.patch
æ$patch <test1.patch
è¿æ ·ï¼test0çå 容å°åtest1çå 容ä¸æ ·ï¼ä½æ¯æ件å称è¿æ¯test0ãå ³äºpatchçé项è§åé¢å¤æ件æ说æãå½åç®å½ä¸å¯ä»¥ætest1.å¦ææ¯è¾çæ¶åtest0æ¯ä¸åå¨çï¼é£ä¹è¿æ¶åä¼çæä¸ä¸ªtest0æ件ã
*ææè¿è¡¥ä¸çtest0è¿å:
$ patch -RE -p0<test1.patch
æ$patch -R <test1.patch
è¿æ ·ï¼test0çå 容å°è¿å为åæ¥æ²¡ææè¿è¡¥ä¸çç¶æãå½åç®å½ä¸å¯ä»¥ætest1.è¿éç-Eé项æ¯è¦æ±patchå¨æ件为空çæ¶åå é¤æ件ï¼è¿ä¸ªé项æ¯ä¸å¿ è¦çå 为patchæ¯æ ¹æ®æ¶é´æ³æ¥å¤æä¸ä¸ªæ件æ¯å¦åå¨ãå¦ææ¯è¾çæ¶åtest0æ¯ä¸åå¨çï¼è¿å°ä¼å é¤test0æ件ã
**
2ãå¤ä¸ªæ件çï¼
é¦å æ¥çæ件ç»æå¦ä¸ï¼
1)å¤å±ç®å½å表:
$ ls -p
prj0/ prj1/
2)åç®å½prj0å表:
$ ls -p prj0
prj0name test0
3)åç®å½prj1å表:
$ ls -p prj1
prj1name test1
4)æ件prj0/prj0name:
$ cat prj0/prj0name
--------
prj0/prj0name
--------
5)æ件prj1/prj1name:
$ cat prj1/prj1name
---------
prj1/prj1name
---------
6)æ件prj0/test0:
$ cat prj0/test0
7)æ件prj1/test1:
$ cat prj1/test1
*å建补ä¸:
$ diff -uNr prj0 prj1 > prj1.patch
è¿é项u表示使ç¨åä¸æ ¼å¼è¾åºè¿æ ·äº§ççè¾åºä¾¿äºé 读æäºä¿®æ¹ï¼N表示æä¸åå¨çæ件çåemptyçï¼r表示éå½å°æ¯è¾åç®å½,æ¯è¾çç»æ被æ åéå®åå°æ件prj1.patchä¸äºã
è¿è¡ä¹åï¼è¾åºçå°±æ¯ä¸ä¸ªè¡¥ä¸ï¼æè¿°äºä¸¤ä¸ªæ件çä¸åï¼è¿ä¸ªè¡¥ä¸å°±æ¯ædiffåæ°ç第ä¸ä¸ªæ件æè¡¥ä¸åæ第äºä¸ªæ件çè¡¥ä¸æ件ã
å®é è¿ç¨ä¾æ¬¡æ¯è¾ä¸¤ä¸ªç®å½ä¸çååæ件ï¼å¦æè¿éä¸å -Nå°±ä¼ææprj0nameåtest0åªå¨prj0ä¸åå¨ï¼prj1nameåtest1åªå¨prj1ä¸åå¨ï¼è¿å°±æ æ³æ¯è¾äºï¼æ以è¿é为äºè½å¤æ¯è¾ï¼å ä¸äº-Né项ã
为äºä¾¿äºç解ï¼è¿éç»åºprj1.patchæ件çå 容ï¼
$ cat prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name -- ::. +
+++ prj1/prj0name -- ::. +
@@ -1,5 +0,0 @@
---------
-
-prj0/prj0name
-
---------
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name -- ::. +
+++ prj1/prj1name -- ::. +
@@ -0,0 +1,5 @@
+---------
+
+prj1/prj1name
+
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test0 -- ::. +
+++ prj1/test0 -- ::. +
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff -uNr prj0/test1 prj1/test1
--- prj0/test1 -- ::. +
+++ prj1/test1 -- ::. +
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
*å°prj0ä¸çæææ件æè¡¥ä¸æ为prj1ä¸çæææ件ï¼
æ¥éª¤å¦ä¸ï¼
1)$ cp prj1.patch ./prj0
2)$ cd prj0
3)$ patch -p1 < prj1.patch
è¿éï¼æè¡¥ä¸æ件å¤å¶å°äºprj0ä¸é¢ï¼ç¶åå°è¯¥æ件夹ä¸é¢çæ件"åæ"prj1ä¸çæ件äº.
$ ls -p
prj1name prj1.patch test1
å ³äºpatchå½ä»¤ç-pé项æ¥æ°ånï¼æææ¯å»æè¡¥ä¸æ件éæå®è·¯å¾çån个'/'åç¼.
ä¾å¦è¡¥ä¸æ件ä¸æå®è·¯å¾æ¯/u/howard/src/blurfl/blurfl.c,é£ä¹p0é项å¤çä¹åçè·¯å¾è¿æ¯åæ¥è·¯å¾ä¸åï¼èp1é项å¤çä¹åçè·¯å¾æ¯u/howard/src/blurfl/blurfl.c,åçp4å¤çä¹åçè·¯å¾æ¯ï¼blurfl/blurfl.c.
注æï¼å¦æå¨å¤å±ç®å½è¿è¡è¿ä¸ªå½ä»¤,é£ä¹ä¼å¨å¤å±ç®å½å建两个prj1nameåtest1æ件ã
*å°æ好补ä¸çprj0ä¸çæææ件è¿åæ为åæ¥æè¡¥ä¸ä¹åçæ件ï¼
$ patch -R -p1 < prj1.patch
è¿è¡ä¹åæ件åæåæ¥çæ件äºï¼å¦ä¸ï¼
$ ls -p
prj0name prj1.patch test0
*å°prj1ä¸çæææ件ååæè¡¥ä¸æ为prj0ä¸çæææ件ï¼
$ patch -R -p1 < prj1.patch
è¿è¡ä¹åprj1ä¸çæ件åæprj0çæ件äºï¼å¦ä¸ï¼
$ ls -p
prj0name prj1.patch test0
*å°prj1ä¸åæè¡¥ä¸åçæ件è¿åæåæ¥çprj1ä¸çæ件ï¼
$ patch -p1 < prj1.patch
è¿è¡ä¹åï¼prj1ä¸çæ件被è¿åäºï¼å¦ä¸ï¼
$ ls -p
prj1name prj1.patch test1
*å¨å¤å±ç®å½æprj0çå 容æè¡¥ä¸æprj1çå 容ï¼
$ls -p
prj0/ prj1.patch
$patch -p0 <prj1.patch
è¿æ ·prj0ä¸çå 容åæäºprj1ä¸çå 容ï¼ä½æ¯prj0çç®å½åä»æ§æ¯prj0,å¦ä¸ï¼
$ls -p prj0
prj1name test1
注æï¼å½åæ件夹ä¸é¢ä¸è½prj1ç®å½ï¼å¦åä¼åºç°ä¸äºè¦åæ示ã
*å¨å¤å±ç®å½æprj0çå 容åæè¡¥ä¸è¿åæåæ¥prj0çå 容ï¼
$ patch -R -p0 <prj1.patch
è¿æ ·åæ¥çæ件å¦ä¸ï¼
$ ls -p prj0
prj0name test0
**
请问Linux中patch产生的信息怎么看,+-是什么意思?
通过diff工具生成补丁,patch工具打上补丁.在使用diff之前,你需要保留一份未修改过的源码,然后在其它地方修改源码的一份拷贝.diff对比这两份源码生成patch.修改过的源码必须保留原来的文件名,例如,如果你修改源码中的a.c文件,那么,修改
å¦ä½ä½¿ç¨git åpatch
å¤åpatchï¼å¤äº§çä¸äºå¥½çideaï¼æå¯ä»¥å¨open software communityä¸è¶æ··è¶å¥½ãé¦å é ç½®gitãè¿éæ两ç§é ç½®æ件ï¼ä¸ä¸ªæ¯å ¨å±çï¼å¨ç¨æ·çhomeç®å½ä¸ï¼ä¸ä¸ªæ¯ç¸åºgitä»åºçãå¦æä½ è®¾ç½®äºå ¨å±çï¼é£ä¹å¯ä»¥ç¨å¨å个gitä»åºä¸ãæ¥çä¸ä¸æå·²ç»é 置好çé ç½®æ件ï¼hacker@hacker:~/qemu-kvm$cat~/.gitconfig[user]name = Wanpeng Liemail = liwp@linux.vnet.ibm.com[sendemail]chainreplyto = falsesmtpserver=/usr/bin/msmtpæ们å¯ä»¥ä½¿ç¨å½ä»¤æ¥é ç½®ï¼$git config --global user.name 'Wanpeng Li'$git config --global user.name 'liwp@linux.vnet.ibm.com'$git config --global sendemail.chainreplyto false$git config --global sendemail.smtpserver/usr/bin/msmtpå¦ä¸ä¸ªéè¦é ç½®çå°±æ¯msmtpçé ç½®æ件ï¼å¦æ没æå®è£ msmtp使ç¨apt-get installå®è£ ãhacker@hacker:~/qemu-kvm$ cat ~/.msmtprcaccount defaulthost ap.relay.ibm.com#auth plainuser liwp@linux.vnet.ibm.compassword xxxxxfrom liwp@linux.vnet.ibm.comå½ä½ ä¿®æ¹æºç æ件åï¼ä½¿ç¨git commit -aå¯ä»¥ç»ä½ çpatchå ä¸äºæ³¨éï¼æ³¨æ第ä¸è¡æ·»å çæ¯patchçååï¼ç¶å空ä¸è¡ï¼ç¶åå¦å¯ä¸è¡æ·»å 对patchç注éã注æè¿patchçååå注éä¹åå¿ é¡»ç©ºä¸è¡ãç¶åæ·»å Signed-off-by: eg:Signed-off-by: Wanpeng Li <liwp@linux.vnet.ibm.comç¶åçæpatchæ件ï¼ä½¿ç¨å½ä»¤git format-patchï¼eg:$git format-patch originå¦æè§å¾è¿ä¸ªcommitä¸æ³è¦äºç¨git resetï¼$gitresetHEAD^ç¶ååéåºå»ï¼è¦ä½¿ç¨git-send-emailä¹åå è¦apt-get install git-email