如何从git存档中排除文件?

时间:2016-08-03 08:01:22

标签: git git-archive

给定一个简单的测试存储库,其中包含一个包含两个文件ab的提交,我可以获取特定文件的列表:

$ git ls-files a
a

或排除特定文件的所有文件的列表:

$ git ls-files . ':!b'
a

我可以创建特定文件的存档:

$ git archive HEAD a | tar tf -
a

但是我无法创建除特定文件之外的所有文件的存档:

$ git archive HEAD . ':!b' | tar tf -
a
b

在我的真实存储库中,使用特定文件存档的选项不是我的选项,因为它超出了最大命令行参数长度。

我知道我可以通过.gitattributes属性存储要在export-ignore中排除的文件列表,但列表是动态生成的。我可以自动更改文件,但是直到另一次提交后才会收到更改。

是否有其他调用无需另外提交即可运行?

4 个答案:

答案 0 :(得分:6)

我认为你几乎把它钉了出来:可以从几个地方读取属性,.gitattributes只是其中最常见的。第二个 - 被认为是每个存储库配置 - 是$GIT_DIR/info/attributes

引用手册:

  

请注意,默认情况下,属性取自中的.gitattributes文件   正在存档的树。如果你想调整输出的方式   事后生成(例如,您提交时没有添加适当的   export-ignore中的.gitattributes,调整已签出的.gitattributes文件   必要时使用--worktree-attributes选项。或者你可以保留   存档中的任何树时应该应用的必要属性   $GIT_DIR/info/attributes档案。

因此,如果可能,请将列表粘贴到该文件,然后执行git archive

另一种方法是不使用git archive而是仅使用tar工作树传递tar接受文件的--exclude-from命令行选项。这对于裸存储库不起作用,但是如果你可以在归档之前检查一些东西,可以通过提供正确git read-tree的{​​{1}}和git checkout-index来完成。和$GIT_INDEX_FILE env。变量

另一种可能的解决方法是逆转方法:$GIT_WORK_TREE(至少GNU tar)支持一种鲜为人知的选项,即能够从管道中的存档删除内容。

基本上,你可以做到

tar

以便管道中的第一个 $ tar -C a_path -c -f - . \ | tar -f - --wildcards --delete '*.pdf' >result.tar 存档所有内容,而第二个传递所有内容,除了匹配tar shell glob patten的文件。

因此,如果使用shell globs指定要删除的文件可以适用于命令行限制,只需将*.pdf的输出传递给git archive prcocess,删除不需要的内容。

答案 1 :(得分:3)

您可以创建tar,然后删除不需要在

内的文件夹和文件
Dim myImportConnectionString As String = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='"_ 
   & txtboxSelectFile.Text & "';Extended Properties=""Excel 8.0;IMEX=1"";CharacterSet=ANSI"

这样您就可以将命令行拆分为低于最大cli参数长度

答案 2 :(得分:3)

您可以将export-ignore放入(已提交).gitattributes文件中,而不是将$GIT_DIR/info/attributes放入(已提交).gitattributes中。或者保留--worktree-attributes未提交,并使用is.na(combi$DT) & !is.na(combi$OD)选项,这也可能不太好,因为它会使您的工作树变脏。

答案 3 :(得分:0)

在Git版本2.20(Windows)和Gitolite服务器(未知版本)下,这对我来说可以排除名为“ b”的文件和文件夹:

git archive HEAD . ":!b" | tar tf -

这也有效:

git archive HEAD . ":(exclude)b" | tar tf -

请注意,我必须在Windows平台上使用双引号,不确定其他平台。