克隆后立即在OSX上修改Linux内核源代码

时间:2016-07-07 14:32:27

标签: linux git macos

当我在OS X上克隆Linux源时,它们会立即被更改,而git reset --hard不会带回内容。这是一个完整的会议:

$ git clone git://github.com/torvalds/linux.git
$ cd linux
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   include/uapi/linux/netfilter/xt_CONNMARK.h
    modified:   include/uapi/linux/netfilter/xt_DSCP.h
    modified:   include/uapi/linux/netfilter/xt_MARK.h
    modified:   include/uapi/linux/netfilter/xt_RATEEST.h
    modified:   include/uapi/linux/netfilter/xt_TCPMSS.h
    modified:   include/uapi/linux/netfilter_ipv4/ipt_ECN.h
    modified:   include/uapi/linux/netfilter_ipv4/ipt_TTL.h
    modified:   include/uapi/linux/netfilter_ipv6/ip6t_HL.h
    modified:   net/netfilter/xt_DSCP.c
    modified:   net/netfilter/xt_HL.c
    modified:   net/netfilter/xt_RATEEST.c
    modified:   net/netfilter/xt_TCPMSS.c

no changes added to commit (use "git add" and/or "git commit -a")

正如我们所看到的,克隆后文件立即发生了变化。甚至不是他们的元数据,而是内容

git diff include/uapi/linux/netfilter_ipv6/ip6t_HL.h
index ebd8ead..6e76dbc 100644
--- a/include/uapi/linux/netfilter_ipv6/ip6t_HL.h
+++ b/include/uapi/linux/netfilter_ipv6/ip6t_HL.h
@@ -1,6 +1,6 @@
-/* Hop Limit modification module for ip6tables
+/* ip6tables module for matching the Hop Limit value
  * Maciej Soltysiak <solt@dns.toxicfilms.tv>
- * Based on HW's TTL module */
+ * Based on HW's ttl module */

 #ifndef _IP6T_HL_H
 #define _IP6T_HL_H
@@ -8,14 +8,14 @@
 #include <linux/types.h>

 enum {
-   IP6T_HL_SET = 0,
-   IP6T_HL_INC,
-   IP6T_HL_DEC
+   IP6T_HL_EQ = 0,     /* equals */
+   IP6T_HL_NE,     /* not equals */
+   IP6T_HL_LT,     /* less than */
+   IP6T_HL_GT,     /* greater than */
 };

-#define IP6T_HL_MAXMODE    IP6T_HL_DEC

-struct ip6t_HL_info {
+struct ip6t_hl_info {
    __u8    mode;
    __u8    hop_limit;
 };

系统信息:

  • 文件系统:Journaled HFS +
  • 操作系统:OS X 10.11.5(15F34)
  • git版本: 2.9.0
  • ~/.gitconfig只有[user]条目。

发生了什么事?为什么在克隆后立即修改文件?

1 个答案:

答案 0 :(得分:8)

即使OS X是一个Unix系统,它仍然与最着名的Unix克隆Linux有很大不同。这是由于历史原因,因为OS X本质上是NextStep(在它的时代是Unix的革命版本),有很多FreeBSD的东西,Linux是一个从头开始编写的内核,有很多GNU的东西,以及OS X的政治原因都是为了接替MacOS 9而设计的。

因此,习惯上默认的HFS文件系统不区分大小写(如Windows NTFS),而传统上区分大小写的是Linux。换句话说 - &#34; A.txt&#34;和&#34; a.txt&#34;是否引用相同的文件?

Git是由Linus Torvalds设计的,他也是Linux内核架构师用于处理内核源代码,所以很自然它有一个Linux思维模式,并期望文件的名称与不同不同的文件。

对于大多数用途而言,这并不重要,但是您遇到了其中一种情况,即如果您将gix存储库中的多个文件克隆到不区分大小写的文件系统中,则它们具有相同的名称。鉴于&#34; A.txt&#34;和&#34; a.txt&#34;再次,对于Linux,两个文件将在克隆之后存在,但对于OS X上的默认HFS文件系统,仅存在一个文件,即创建最后一个(然后将覆盖前一个)文件的文件。

请注意,git仍然认为这两个文件都存在,因为文件系统都表示&#34; A.txt&#34;和&#34; a.txt&#34;当被问到时,他们在场这就是为什么你没有被告知其中一个人失踪的原因。

治愈很简单。使用区分大小写的文件系统来完成工作。对于OS X,最简单的方法是使用“磁盘工具”创建适当的磁盘映像 - &gt;档案 - &gt; New Image并选择正确版本的OS X扩展为格式。然后双击图像以安装它,并在Terminal.app中导航到它。然后做克隆。你现在应该有合适的资源。

但请注意,您很可能无法对其进行任何操作,例如构建或类似操作,因为OS X编译器工具链与Linux工具链有很大不同。如果要编译新内核,最简单的方法是在Linux上执行。 Virtualbox和Ubuntu 16.04对我来说效果非常好。