关于此主题的问题很多,但没有一个涉及~/.gitignore
。
我有一个奇怪的项目,它的顶层项目目录称为project/
,里面充满了垃圾,但至少有一个重要的子目录,例如project/feedme/
。我想.gitignore
project/
中的所有内容,但取消.gitignore
project/feedme/
及其内容。使用否定模式很容易:
project$ cat .gitignore
/*
!/feedme/
我有一个文件project/feedme/.exrc
,我想忽略它。作为vi
用户,我经常将.exrc
文件用于本地编辑器设置,因此我在~/.gitconfig
(由core.excludesFile
Git设置指定)中有一个条目: / p>
project$ cat ~/.gitignore
.exrc
不幸的是,git
似乎不想忽略.exrc
:
project$ git status -s
?? feedme/
project$ git add feedme/
project$ git status -s
A feedme/.exrc
为什么Git不会忽略project/feedme/.exrc
?
为什么我认为这应该起作用?手册页 gitignore (5)如此表示:
gitignore 文件中的每一行都指定一个模式。决定时 是否忽略路径,Git通常会检查 gitignore 模式 多个来源(从高到低依次排列) 最低(在一个优先级内,最后一个匹配模式 决定结果):
- 从与计算机目录相同目录中的 .gitignore 文件读取的
[…]
模式 路径,或在任何父目录中,具有较高级别的模式 文件(直到工作树的顶层)被覆盖 较低级别文件中的文件,直到包含
的目录 文件。 […][…]
从配置变量指定的文件中读取的模式 core.excludesFile 。
由于最后读取了~/.gitignore
中的模式,因此我认为无论本地.exrc
为何,.gitgnore
最终都会被忽略。
一个可能的解释是(再次从 gitignore (5)手册页,着重强调)
是 如果文件的父目录不能重新包含 文件被排除 。
也以其双重形式(在手册页中不是)应用
是 如果文件的父目录不能排除 文件重新包含。
如果是这种情况,我会认为这是一个错误;至少应在文档中明确说明。
P.S .:我的~/.gitignore
在正常情况下可以正常工作,因此问题不存在。
Prosoitos是正确的,首先读取全局~/.gitignore
, ,因此在{em>之后{em> project/feedme/
重新包含.exrc
子目录全局忽略。但是我仍然面临另一个奇怪的问题。
据我所知,现在将.exrc
放在我的~/.gitignore
的最后一行等效(如果project/.git/info/excludes
为空)等同于将.exrc
放在第一行project/.gitignore
中的。但是,如果我这样做,这次project/feedme/.exrc
将被忽略!
project$ cat ~/.gitignore
project$ cat .gitignore
.exrc
/*
!/feedme/
project$ git ls-files --other --ignored --exclude-standard
.gitignore
feedme/.exrc
这是怎么回事?
答案 0 :(得分:1)
由于〜/ .gitignore的模式是最后读取的[...]
不。这是您弄错了的地方。您引用的Git手册部分:
Git通常会检查多个来源的gitignore模式,并具有以下优先顺序,从最高到最低 [...]
意味着全局.gitignore
被本地变量覆盖,而不是相反。
因此,本地!/feedme/
中的.gitignore
会覆盖全局.exrc
中的feedme/.exrc
。因此,不会排除.exrc
。
一种简单的解决方案是将.gitignore
添加到本地!/feedme/
文件中,并确保其位于git check-ignore -v feedme/.exrc
行下方,因为:
(在一个优先级内,最后一个匹配模式决定结果)
注意:
诚然,“优先顺序”一词可能令人困惑。
在这里,“更高的优先级”表示它比“更重要”(因此优先)。
您似乎已经从运算符优先级的意义上理解了它,其中“较高优先级”表示“先执行”,这将导致相反的结果。因此造成混乱。
现在您已对情况进行了更正,我认为您是正确的。
我转载了您的情况,然后运行:
.gitignore:1:.exrc feedme/.exrc
我得到:
.exrc
表明!/feedme/
并未排除对 <asp:Label ID="Label5" Text='transfer text here' runat ="server" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="user_name" DataSourceID="SqlDataSource1" Height="100px" Width="383px">
<Columns>
<asp:CommandField HeaderText="select" SelectText="select " ShowSelectButton="True">
</asp:CommandField>
<asp:BoundField DataField="user_name" HeaderText="user_name" ReadOnly="True" SortExpression="user_name" />
<asp:BoundField DataField="user_full_name_ar" HeaderText="user_full_name_ar" SortExpression="user_full_name_ar" />
<asp:TemplateField HeaderText="user_full_name_ar" SortExpression="user_full_name_ar">
<ItemTemplate>
<asp:Label ID="Label4" Text='<%# Session["lang"].ToString() == "en"? Eval("user_full_name_en") : Eval("user_full_name_ar") %>' runat ="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="ButtonSearch" runat="server" text="select" OnClientClick ="txt();" CommandArgument ='<%# Bind("user_name") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
的排除。
我尝试用Google搜索它,但也找不到任何文档。