给定一个简单的测试存储库,其中包含一个包含两个文件a
和b
的提交,我可以获取特定文件的列表:
$ 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
中排除的文件列表,但列表是动态生成的。我可以自动更改文件,但是直到另一次提交后才会收到更改。
是否有其他调用无需另外提交即可运行?
答案 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平台上使用双引号,不确定其他平台。