例如,如果我不希望 html 文件,我可以编写以下内容:
git checkout HEAD . --no .html
如果这样的东西存在。是否已经内置了一种方法,或者我只需在检出后运行其他东西?
git checkout HEAD . --no .html
如果这样的东西存在。是否已经内置了一种方法,或者我只需在检出后运行其他东西?
如果你只想检出仓库的一部分,你可以使用Git的稀疏检出选项,该选项具有强大的包含/排除规则。
以下StackOverflow问题提供了一些有用的指导:
GIT checkout except one folder
但简要来说:
启用 sparseCheckout
选项:
git config core.sparseCheckout true
创建名为.git/info/sparse-checkout
的文件,其中包含:
/*
!node_modules
这实际上意味着,在将存储库检出到工作目录时,除node_modules
目录以外的所有内容都会被包含。
!^node_modules
,否则它也会忽略名为 node_modules
的子目录。 - Nathangit archive
的用途。以下是手册页面(链接)中的几个示例:
您应该能够使用
git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)
创建一个tar归档文件,其中包含当前分支上最新提交的内容,并将其提取到/var/tmp/junk目录中。
git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip > git-1.4.0.tar.gz
为v1.4.0版本创建一个压缩的tarball。
export-ignore
属性使其完全符合您的要求:
例如,要排除目录
export-ignore
具有属性export-ignore的文件和目录将不会添加到存档文件中。有关详细信息,请参见gitattributes(5)。
private
以及文件mine.txt
和secret.c
,可以在文件.gitattributes
中输入:private/ export-ignore
secret.c export-ignore
就像.gitignore文件一样,你可以将它们放在仓库中的任何位置,并且它们会从该目录运行,但是从顶层开始操作是一个好主意。
如果您只想进行一次更改(或不需要持续性更改),或者您不想将文件放在 .gitignore
中,那么请按照以下步骤操作:
checkout
排除的特定文件储存起来git stash push -m "files_to_ignore" my/path/of/the/file/file.txt
git checkout .
git stash apply stash^{/files_to_ignore}
alias reset-non-dev='git stash push -m "ignore_files" MyRepo/file1.txt MyRepo/dir/file2.js MyRepo/dir/dir2/file3.cs PSOne/Startup/PSOne/Views/Login.xaml.cs ; git checkout . ; git stash apply stash^{/ignore_files} ;'
我希望将我的代码不带测试文件部署到生产服务器上。
最简单的方法就是在解压归档文件后使用以下命令删除所有测试文件:rsync --exclude 'tests'
。
你不仅可以像Simon East的答案中提到的那样使用git sparse-checkout
,还可以使用规则,例如
/*
!^node_modules
git sparse-checkout
"(man)命令学会了一种用于稀疏规则定义的调试辅助工具。
查看提交 00408ad,提交 24fc2cd(2023年3月27日),由William Sprent(williams-unity
)完成。
(由Junio C Hamano -- gitster
--在提交 d02343b中合并,2023年4月11日)
builtin/sparse-checkout
:添加check-rules命令签名作者:William Sprent
没有直接的方法可以查询 git 哪些路径与给定的稀疏规则匹配。git ls-files -t
'(man) 的命令来检查是否设置了跳过工作树位。sparse-checkout
' 内置命令中添加一个 'check-rules
' 子命令,类似于 'git check-ignore
'(man) 和 'git check-attr
'(man) 命令。--rules-file
' 选项,允许调用者显式传递稀疏检出规则,格式与 'sparse-checkout set --stdin
' 接受的格式相同。--rules-file
' 标志下重复使用输入模式的处理,修改 'add_patterns_from_input()
' 以能够从 'FILE
' 中读取,而不仅仅是标准输入。update_modes()
' 中分离出来,以便可以在不修改配置的情况下调用它。check-sparsity
' 命令。sparse-checkout
' 下允许:git sparse-checkout
现在在其手册页面中包含以下内容:
'git sparse-checkout' (init | list | set | add | reapply | disable | check-rules) [<options>]
git sparse-checkout
现在在其手册页面中包含以下内容:
'check-rules'
检查稀疏规则是否与一个或多个路径匹配。
默认情况下,check-rules
从标准输入读取路径列表,并仅输出与当前稀疏规则匹配的路径。输入应该包含每行一个路径,与 git ls-tree --name-only
的输出相匹配,包括以双引号 (") 开头的路径名被解释为 C 风格的引用字符串。
当使用 --rules-file <file>
标志调用时,输入文件将与在 <file>
中找到的稀疏检出规则进行匹配,而不是当前规则。文件中的规则应该与 git sparse-checkout set --stdin
接受的形式相同(特别是它们必须是换行符分隔的)。
默认情况下,传递给 --rules-file
选项的规则被解释为锥形模式目录。要通过 --rules-file
传递非锥形模式模式,请将该选项与 --no-cone
选项组合使用。
当使用 -z
标志调用时,标准输入上的路径格式以及输出路径都是 \0 结尾的,而不是引用的。请注意,这不适用于使用 --rules-file
选项传递的规则格式。
示例:
cat >rules <<-\EOF &&
folder1
deep/deeper1/deepest
EOF
git -C bare ls-tree -r --name-only HEAD >all-files &&
git -C bare sparse-checkout check-rules --cone \
--rules-file ../rules >check-rules-file <all-files &&
git -C repo sparse-checkout set --cone --stdin <rules&&
git -C repo ls-files -t >out &&
sed -n "/^S /!s/^. //p" out >ls-files &&
git -C repo sparse-checkout check-rules >check-rules-default <all-files