Клонирование git-репозитория, и у него уже есть грязный рабочий каталог ... Whaaaaa? - PullRequest
17 голосов
/ 12 сентября 2011

Итак, я не понимаю, что происходит. Я никогда не взламывал ядро ​​Linux, так что, возможно, это обычное дело. Если это так, извините за новый вопрос.

$ git clone https://github.com/torvalds/linux.git

Тогда

$ git status

.

# On branch 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/linux/netfilter/xt_CONNMARK.h
#   modified:   include/linux/netfilter/xt_DSCP.h
#   modified:   include/linux/netfilter/xt_MARK.h
#   modified:   include/linux/netfilter/xt_RATEEST.h
#   modified:   include/linux/netfilter/xt_TCPMSS.h
#   modified:   include/linux/netfilter_ipv4/ipt_ECN.h
#   modified:   include/linux/netfilter_ipv4/ipt_TTL.h
#   modified:   include/linux/netfilter_ipv6/ip6t_HL.h
#   modified:   net/ipv4/netfilter/ipt_ECN.c
#   modified:   net/netfilter/xt_DSCP.c
#   modified:   net/netfilter/xt_HL.c
#   modified:   net/netfilter/xt_RATEEST.c
#   modified:   net/netfilter/xt_TCPMSS.c
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   samples/hidraw/

В чем дело?

РЕДАКТИРОВАТЬ : вывод Git diff:

diff --git a/include/linux/netfilter/xt_CONNMARK.h b/include/linux/netfilter/xt_CONNMARK.h
index 2f2e48e..efc17a8 100644
--- a/include/linux/netfilter/xt_CONNMARK.h
+++ b/include/linux/netfilter/xt_CONNMARK.h
@@ -1,6 +1,31 @@
-#ifndef _XT_CONNMARK_H_target
-#define _XT_CONNMARK_H_target
+#ifndef _XT_CONNMARK_H
+#define _XT_CONNMARK_H

-#include <linux/netfilter/xt_connmark.h>
+#include <linux/types.h>

-#endif /*_XT_CONNMARK_H_target*/
+/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
+ * by Henrik Nordstrom <hno@marasystems.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+enum {
+   XT_CONNMARK_SET = 0,
+   XT_CONNMARK_SAVE,
+   XT_CONNMARK_RESTORE
+};
+
+struct xt_connmark_tginfo1 {
+   __u32 ctmark, ctmask, nfmask;
+   __u8 mode;
+};
+
+struct xt_connmark_mtinfo1 {
+   __u32 mark, mask;
+   __u8 invert;
+};
+
+#endif /*_XT_CONNMARK_H*/
diff --git a/include/linux/netfilter/xt_DSCP.h b/include/linux/netfilter/xt_DSCP.h
index 648e0b3..15f8932 100644
--- a/include/linux/netfilter/xt_DSCP.h
+++ b/include/linux/netfilter/xt_DSCP.h
@@ -1,26 +1,31 @@
-/* x_tables module for setting the IPv4/IPv6 DSCP field
+/* x_tables module for matching the IPv4/IPv6 DSCP field
  *
  * (C) 2002 Harald Welte <laforge@gnumonks.org>
- * based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
  * This software is distributed under GNU GPL v2, 1991
  *
  * See RFC2474 for a description of the DSCP field within the IP Header.
  *
- * xt_DSCP.h,v 1.7 2002/03/14 12:03:13 laforge Exp
+ * xt_dscp.h,v 1.3 2002/08/05 19:00:21 laforge Exp
 */
-#ifndef _XT_DSCP_TARGET_H
-#define _XT_DSCP_TARGET_H
-#include <linux/netfilter/xt_dscp.h>
+#ifndef _XT_DSCP_H
+#define _XT_DSCP_H
+
 #include <linux/types.h>

-/* target info */
-struct xt_DSCP_info {
+#define XT_DSCP_MASK   0xfc    /* 11111100 */
+#define XT_DSCP_SHIFT  2
+#define XT_DSCP_MAX    0x3f    /* 00111111 */
+
+/* match info */
+struct xt_dscp_info {
    __u8 dscp;
+   __u8 invert;
 };

-struct xt_tos_target_info {
-   __u8 tos_value;
+struct xt_tos_match_info {
    __u8 tos_mask;
+   __u8 tos_value;
+   __u8 invert;
 };

-#endif /* _XT_DSCP_TARGET_H */
+#endif /* _XT_DSCP_H */
diff --git a/include/linux/netfilter/xt_MARK.h b/include/linux/netfilter/xt_MARK.h
index 41c456d..ecadc40 100644
--- a/include/linux/netfilter/xt_MARK.h
+++ b/include/linux/netfilter/xt_MARK.h
@@ -1,6 +1,15 @@
-#ifndef _XT_MARK_H_target
-#define _XT_MARK_H_target
+#ifndef _XT_MARK_H
+#define _XT_MARK_H

-#include <linux/netfilter/xt_mark.h>
+#include <linux/types.h>

-#endif /*_XT_MARK_H_target */
+struct xt_mark_tginfo2 {
+   __u32 mark, mask;
+};
+
+struct xt_mark_mtinfo1 {
+   __u32 mark, mask;
+   __u8 invert;
+};
+
+#endif /*_XT_MARK_H*/
diff --git a/include/linux/netfilter/xt_RATEEST.h b/include/linux/netfilter/xt_RATEEST.h
index 6605e20..d40a619 100644
--- a/include/linux/netfilter/xt_RATEEST.h
+++ b/include/linux/netfilter/xt_RATEEST.h
@@ -1,15 +1,37 @@
-#ifndef _XT_RATEEST_TARGET_H
-#define _XT_RATEEST_TARGET_H
+#ifndef _XT_RATEEST_MATCH_H
+#define _XT_RATEEST_MATCH_H

 #include <linux/types.h>

-struct xt_rateest_target_info {
-   char            name[IFNAMSIZ];
-   __s8            interval;
-   __u8        ewma_log;
+enum xt_rateest_match_flags {
+   XT_RATEEST_MATCH_INVERT = 1<<0,
+   XT_RATEEST_MATCH_ABS    = 1<<1,
+   XT_RATEEST_MATCH_REL    = 1<<2,
+   XT_RATEEST_MATCH_DELTA  = 1<<3,
+   XT_RATEEST_MATCH_BPS    = 1<<4,
+   XT_RATEEST_MATCH_PPS    = 1<<5,
+};
+
+enum xt_rateest_match_mode {
+   XT_RATEEST_MATCH_NONE,
+   XT_RATEEST_MATCH_EQ,
+   XT_RATEEST_MATCH_LT,
+   XT_RATEEST_MATCH_GT,
+};
+
+struct xt_rateest_match_info {
+   char            name1[IFNAMSIZ];
+   char            name2[IFNAMSIZ];
+   __u16       flags;
+   __u16       mode;
+   __u32       bps1;
+   __u32       pps1;
+   __u32       bps2;
+   __u32       pps2;

    /* Used internally by the kernel */
-   struct xt_rateest   *est __attribute__((aligned(8)));
+   struct xt_rateest   *est1 __attribute__((aligned(8)));
+   struct xt_rateest   *est2 __attribute__((aligned(8)));
 };

-#endif /* _XT_RATEEST_TARGET_H */
+#endif /* _XT_RATEEST_MATCH_H */
diff --git a/include/linux/netfilter/xt_TCPMSS.h b/include/linux/netfilter/xt_TCPMSS.h
index 9a6960a..fbac56b 100644
--- a/include/linux/netfilter/xt_TCPMSS.h
+++ b/include/linux/netfilter/xt_TCPMSS.h
@@ -1,12 +1,11 @@
-#ifndef _XT_TCPMSS_H
-#define _XT_TCPMSS_H
+#ifndef _XT_TCPMSS_MATCH_H
+#define _XT_TCPMSS_MATCH_H

 #include <linux/types.h>

-struct xt_tcpmss_info {
-   __u16 mss;
+struct xt_tcpmss_match_info {
+    __u16 mss_min, mss_max;
+    __u8 invert;
 };

-#define XT_TCPMSS_CLAMP_PMTU 0xffff
-
-#endif /* _XT_TCPMSS_H */
+#endif /*_XT_TCPMSS_MATCH_H*/
diff --git a/include/linux/netfilter_ipv4/ipt_ECN.h b/include/linux/netfilter_ipv4/ipt_ECN.h
index bb88d53..eabf95f 100644
--- a/include/linux/netfilter_ipv4/ipt_ECN.h
+++ b/include/linux/netfilter_ipv4/ipt_ECN.h
@@ -1,33 +1,35 @@
-/* Header file for iptables ipt_ECN target
+/* iptables module for matching the ECN header in IPv4 and TCP header
  *
- * (C) 2002 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2002 Harald Welte <laforge@gnumonks.org>
  *
  * This software is distributed under GNU GPL v2, 1991
  * 
- * ipt_ECN.h,v 1.3 2002/05/29 12:17:40 laforge Exp
+ * ipt_ecn.h,v 1.4 2002/08/05 19:39:00 laforge Exp
 */
-#ifndef _IPT_ECN_TARGET_H
-#define _IPT_ECN_TARGET_H
+#ifndef _IPT_ECN_H
+#define _IPT_ECN_H

 #include <linux/types.h>
-#include <linux/netfilter/xt_DSCP.h>
+#include <linux/netfilter/xt_dscp.h>

 #define IPT_ECN_IP_MASK    (~XT_DSCP_MASK)

-#define IPT_ECN_OP_SET_IP  0x01    /* set ECN bits of IPv4 header */
-#define IPT_ECN_OP_SET_ECE 0x10    /* set ECE bit of TCP header */
-#define IPT_ECN_OP_SET_CWR 0x20    /* set CWR bit of TCP header */
+#define IPT_ECN_OP_MATCH_IP    0x01
+#define IPT_ECN_OP_MATCH_ECE   0x10
+#define IPT_ECN_OP_MATCH_CWR   0x20

-#define IPT_ECN_OP_MASK        0xce
+#define IPT_ECN_OP_MATCH_MASK  0xce

-struct ipt_ECN_info {
-   __u8 operation; /* bitset of operations */
-   __u8 ip_ect;    /* ECT codepoint of IPv4 header, pre-shifted */
+/* match info */
+struct ipt_ecn_info {
+   __u8 operation;
+   __u8 invert;
+   __u8 ip_ect;
    union {
        struct {
-           __u8 ece:1, cwr:1; /* TCP ECT bits */
+           __u8 ect;
        } tcp;
    } proto;
 };

-#endif /* _IPT_ECN_TARGET_H */
+#endif /* _IPT_ECN_H */
diff --git a/include/linux/netfilter_ipv4/ipt_TTL.h b/include/linux/netfilter_ipv4/ipt_TTL.h
index f6ac169..37bee44 100644
--- a/include/linux/netfilter_ipv4/ipt_TTL.h
+++ b/include/linux/netfilter_ipv4/ipt_TTL.h
@@ -1,5 +1,5 @@
-/* TTL modification module for IP tables
- * (C) 2000 by Harald Welte <laforge@netfilter.org> */
+/* IP tables module for matching the value of the TTL
+ * (C) 2000 by Harald Welte <laforge@gnumonks.org> */

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

 enum {
-   IPT_TTL_SET = 0,
-   IPT_TTL_INC,
-   IPT_TTL_DEC
+   IPT_TTL_EQ = 0,     /* equals */
+   IPT_TTL_NE,     /* not equals */
+   IPT_TTL_LT,     /* less than */
+   IPT_TTL_GT,     /* greater than */
 };

-#define IPT_TTL_MAXMODE    IPT_TTL_DEC

-struct ipt_TTL_info {
+struct ipt_ttl_info {
    __u8    mode;
    __u8    ttl;
 };
diff --git a/include/linux/netfilter_ipv6/ip6t_HL.h b/include/linux/netfilter_ipv6/ip6t_HL.h
index ebd8ead..6e76dbc 100644
--- a/include/linux/netfilter_ipv6/ip6t_HL.h
+++ b/include/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;
 };
diff --git a/net/ipv4/netfilter/ipt_ECN.c b/net/ipv4/netfilter/ipt_ECN.c
index 4bf3dc4..2b57e52 100644
--- a/net/ipv4/netfilter/ipt_ECN.c
+++ b/net/ipv4/netfilter/ipt_ECN.c
@@ -1,138 +1,127 @@
-/* iptables module for the IPv4 and TCP ECN bits, Version 1.5
+/* IP tables module for matching the value of the IPv4 and TCP ECN bits
  *
- * (C) 2002 by Harald Welte <laforge@netfilter.org>
+ * (C) 2002 by Harald Welte <laforge@gnumonks.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
-*/
+ */
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 #include <linux/in.h>
-#include <linux/module.h>
-#include <linux/skbuff.h>
 #include <linux/ip.h>
 #include <net/ip.h>
+#include <linux/module.h>
+#include <linux/skbuff.h>
 #include <linux/tcp.h>
-#include <net/checksum.h>

 #include <linux/netfilter/x_tables.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
-#include <linux/netfilter_ipv4/ipt_ECN.h>
+#include <linux/netfilter_ipv4/ipt_ecn.h>

-MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
-MODULE_DESCRIPTION("Xtables: Explicit Congestion Notification (ECN) flag modification");
+MODULE_DESCRIPTION("Xtables: Explicit Congestion Notification (ECN) flag match for IPv4");
+MODULE_LICENSE("GPL");

-/* set ECT codepoint from IP header.
- *     return false if there was an error. */
-static inline bool
-set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
+static inline bool match_ip(const struct sk_buff *skb,
+               const struct ipt_ecn_info *einfo)
 {
-   struct iphdr *iph = ip_hdr(skb);
-
-   if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) {
-       __u8 oldtos;
-       if (!skb_make_writable(skb, sizeof(struct iphdr)))
-           return false;
-       iph = ip_hdr(skb);
-       oldtos = iph->tos;
-       iph->tos &= ~IPT_ECN_IP_MASK;
-       iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK);
-       csum_replace2(&iph->check, htons(oldtos), htons(iph->tos));
-   }
-   return true;
+   return ((ip_hdr(skb)->tos & IPT_ECN_IP_MASK) == einfo->ip_ect) ^
+          !!(einfo->invert & IPT_ECN_OP_MATCH_IP);
 }

-/* Return false if there was an error. */
-static inline bool
-set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo)
+static inline bool match_tcp(const struct sk_buff *skb,
+                const struct ipt_ecn_info *einfo,
+                bool *hotdrop)
 {
-   struct tcphdr _tcph, *tcph;
-   __be16 oldval;
-
-   /* Not enough header? */
-   tcph = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_tcph), &_tcph);
-   if (!tcph)
+   struct tcphdr _tcph;
+   const struct tcphdr *th;
+
+   /* In practice, TCP match does this, so can't fail.  But let's
+    * be good citizens.
+    */
+   th = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_tcph), &_tcph);
+   if (th == NULL) {
+       *hotdrop = false;
        return false;
+   }

-   if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) ||
-        tcph->ece == einfo->proto.tcp.ece) &&
-       (!(einfo->operation & IPT_ECN_OP_SET_CWR) ||
-        tcph->cwr == einfo->proto.tcp.cwr))
-       return true;
-
-   if (!skb_make_writable(skb, ip_hdrlen(skb) + sizeof(*tcph)))
-       return false;
-   tcph = (void *)ip_hdr(skb) + ip_hdrlen(skb);

...

(усечено, потому что в противном случае оно превысит предел тела сообщения stackoveflow.)

Ответы [ 6 ]

18 голосов
/ 24 сентября 2011

Какую ОС вы используете? Эта ошибка вызвана тем, что ваша файловая система не чувствительна к регистру, как по умолчанию в Mac OS X.

5 голосов
/ 12 сентября 2011

Итак, вы проверили источники Linux в файловой системе, которая не чувствительна к регистру. Это проблема. Попробуйте проверить на ext2 разделе.

В качестве обходного пути вы также можете использовать функцию git sparsecheckout:

git config core.sparsecheckout true
echo /* > .git/info/sparse-checkout 
echo !include/linux/netfilter/ > .git/info/sparse-checkout 
echo !include/linux/netfilter_ipv4/ > .git/info/sparse-checkout 
echo !include/linux/netfilter_ipv6/ > .git/info/sparse-checkout 
echo !net/ipv4/netfilter/ > .git/info/sparse-checkout 
echo !net/netfilter > .git/info/sparse-checkout
git read-tree --reset -u HEAD
2 голосов
/ 22 сентября 2018

Эта ошибка вызвана тем, что ваша файловая система не чувствительна к регистру

Вам больше не нужно догадываться , не с Git 2.20 (Q4 2018, семь летпозже после OP)

Это правда, что запуск "git clone" для проекта, который содержит два файла с именами путей, отличающимися только в случаях в нечувствительной к регистру файловой системе, приведет к потере одного из файлов, потому что основной файлФайловая система неспособна удерживать оба одновременно.
Но сейчас ... сделана попытка обнаружить такой случай и предупредить .

См. commit b878579 (17 августа 2018 г.) Duy Nguyen (pclouds) .
(объединено Junio ​​C Hamano - gitster - в commit c240732 , 17 сентября 2018 г.)

clone: сообщать о повторяющихся записях в файловых системах без учета регистра

Пути, отличающиеся только в случае, если вчувствительные к регистру файловые системы, но если эти репозитории клонируются в регистронезависимую, йоу тебя проблемы.Первое, на что стоит обратить внимание, это то, что «git status» никогда не будет чистым без указания, что именно является «dirty».

Этот патч немного помогает в ситуации, указывая на проблему во время клонирования.
Несмотря на то, что этот патч говорит о чувствительности к регистру, в патче не делается никаких предположений о правилах свертывания файловой системой.Он просто замечает, что если запись уже была извлечена во время клонирования, когда мы собираемся написать новый путь, за этим стоят некоторые правила свертывания.

В случае, если мы не можем полагаться на файловую систему(через inode число), чтобы выполнить эту проверку, вернитесь к fspathcmp(), который не идеален, но не должен давать ложных срабатываний.

Вы можете увидеть unpack-trees.cс новой функцией report_collided_checkout(), которая будет отображать предупреждение:

the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:

Больше никаких сюрпризов здесь.


codewarrior упоминает в комментариях , что Windows теперь поддерживает (2018-2019) чувствительную к регистру файловую систему с fsutil.exe file setCaseSensitiveInfo C:\a\path enable ...
Да, но, как видно из MicrosoftDocs/windowsserverdocs выпуск 977 :

Необходимо включить Подсистема Windows для Linux , прежде чем это сработает .

Выполните следующую команду от имени администратора в PowerShell, чтобывключите эту дополнительную функцию:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Вам будет предложено перезагрузить компьютер, когда он
После перезагрузки компьютера вы сможете запускать Fsutil в качестве администратора в окне командной строки, как и ожидалось.

См. " Чувствительность к регистру для каждого каталогаи WSL"

Начиная с инсайдерской сборки Windows 17093, мы представили новый способ обработки чувствительных к регистру файлов в Windows: чувствительность к регистру для каждого каталога .
Мы используем эту возможность в подсистеме Windows для Linux, чтобы обеспечить лучшую совместимость при использовании файлов, чувствительных к регистру, и вы также можете использовать ее самостоятельно с обычными приложениями Windows.

Начиная со сборки 17110, поведение DrvFs по умолчанию теперь эквивалентно использованию «case=dir».
Это означает, что любые каталоги, созданные вами с помощью WSL до сборки 17093, больше не будут обрабатываться с учетом регистра.Чтобы это исправить, используйте fsutil.exe, чтобы пометить существующие каталоги с учетом регистра.

2 голосов
/ 12 сентября 2011

Комментарии, скорее всего, верны в их подозрении на окончание строки. Попробуйте установить эту опцию:

git config --global core.autocrlf true

Затем повторно клонируйте репозиторий.

Используйте значение true в Windows и input в OSX / Unix.

Посмотрите эту страницу справки Github для получения дополнительной информации.

1 голос
/ 26 июня 2019

Хит той же проблемы, но это было почти 8 лет, Windows теперь поддерживает регистр с учетом регистра.

fsutil.exe file setCaseSensitiveInfo <folder path> enable

Затем повторно синхронизируйте папку. Обратите внимание, что это не повлияет на подкаталог, поэтому необходимо запускать эту команду для каждой папки.

1 голос
/ 12 сентября 2011

Одна вещь, которую вы можете попробовать, это git update-index --refresh на случай, если кэш информации о файловом стате каким-то образом заработал в процессе клонирования (может быть, с помощью настройки ntpd тактового генератора или подобного?). Если это не поможет, нам, вероятно, понадобится узнать, как выглядит вывод git diff, чтобы помочь вам больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...