【问题标题】:How do I add certain files by wildcrd to git without adding files matching the parrern in subdirectories如何通过通配符将某些文件添加到git而不在子目录中添加与模式匹配的文件
【发布时间】:2022-01-01 08:48:38
【问题描述】:

我正在使用 git(在 Windows 上)对某些目录中的文件进行版本控制,并在其他目录中进行源代码控制。在某些目录中,我想通过通配符添加某些文件,但不是子目录中的文件,除非我指定该子目录或该目录中的特定文件。

我无法通过资源管理器完成此操作,因为它有几十个或数百个文件,我可能无法准确选择我正在寻找的内容(如?e?g*.*)但不是其他人,所以我正在使用命令行(我已经安装了 git 集成,所以如果它只是某些文件,我可以将它们挑选出来,然后右键单击并单击“git add”,但如果我必须手动去选择,这将无法正常工作文件;因此我使用命令行和通配符选择。

我不想使用 .gitignore,因为可能有一些子目录我想要一些文件而不是其他文件,这可能意味着必须列出数百或数千个文件。此外,我正在使用多个存储库,创建另一个 .gitignore 并且可能必须添加数十或数百个子目录会很乏味。我试过了
git add ./A* /.a*
仅在此目录中添加以 A 或 a 开头的文件,但它会在此目录 和所有子目录 中查找以 A 或 a 开头的每个文件。我只是想要一种简单的方式来说“只在这个目录中添加某些文件而不是子目录”,它可以在任何目录中工作,而无需在每个目录中设置、修改或维护一个 .gitignore 文件/我要回购的项目。

我的意思是,这是正常行为吗?那当你指定 * git 时假定这个目录和下面的所有内容?这似乎是荒谬和过分的。从什么时候开始,命令会自动作用于子目录?这是Linux的事情吗?如果我使用
rm a*
它会递归搜索每个目录吗?我认为您必须使用开关(-s)来处理子目录。应该有一种简单的说法,但我在 Git 的文档中找不到。

【问题讨论】:

  • "当你指定 * git 时假定这个目录和下面的所有内容?" 不,不是git 它是git add。如果你给它传递一个目录,它会递归地添加所有文件和子目录。为避免这种情况,您必须仅将文件列为 git add 参数。学习 Linux 命令find,尤其是。它的参数-depth 1,它应该可以帮助你只列出文件。

标签: git shell


【解决方案1】:

您观察到预期的行为:

如果您有一个名为dir 的目录,d*glob 模式将在其扩展中包含dirgit add dir 将添加dir 下的所有文件。


仅列出文件的一种方法是使用允许列出具有特定过滤器的名称的实用程序,例如 GNU find

find . -name 'A*' -type f -depth 1

将列出:

  • -type f 仅限文件
  • -name A* 的名字以A 开头
  • -depth 1 仅在当前目录级别

然后您可以使用xargs 将其输出提供给git add

find . -name 'A*' -type f -depth 1 | xargs git add

注意:如果您正在运行 Windows,则取决于您使用的 shell,find 可能会引用 find windows utility,它不会做同样的事情。

选择使用 GNU find 的方式,例如:使用 git-bash 或 WSL。

【讨论】:

  • find . -name 'A*' -type f -depth 1 -exec git add '{}' \+
猜你喜欢
  • 2017-06-20
  • 2019-09-22
  • 2014-02-10
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多