【问题标题】:git update-index --assume-unchanged on directorygit update-index --assume-unchanged 对目录
【发布时间】:2012-08-30 13:44:49
【问题描述】:

git 1.7.12

我想将给定目录下的所有文件标记为假定未更改。

  1. git update-index --assume-unchanged dir/ 给出“忽略路径”。

  2. git update-index --assume-unchanged dir/* 很快就会失败,因为它会遇到未被跟踪的文件,因此它会给出“致命:无法标记文件”并退出。

  3. 尝试生成要标记的文件列表。 cd 进入所需目录,然后运行 ​​git ls-files | tr '\n' ' ' | git update-index --assume-unchanged。这不会产生错误消息,但不会成功标记文件。命令的第一部分git ls-files | tr '\n' ' ' 正确生成了一个空格分隔的列表,其中包含我要标记的所有文件。如果我将该命令的输出复制并粘贴到命令行,则 git update-index 命令有效。管道有什么问题?

不,我将dir 添加到.gitignore 是不够的。我需要将这些文件放在存储库中,但是会在本地进行不需要的更改,这些更改需要被忽略,以便用户可以进行拉取。

【问题讨论】:

  • 你拼错了--assume-unchanged
  • @AdamMudianto 已修复

标签: git command-line pipe


【解决方案1】:

git update-index 想要在其命令行上而不是在其标准输入上的文件名。

第 1 步:

cd 放入你要假设的文件夹不变

第 2 步:

您可以这样做:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

尽管在任何一种情况下,带有空格的文件名都会有问题。如果你有这些,你可以使用这个:

git ls-files -z | xargs -0 git update-index --assume-unchanged

编辑:合并来自@MatthewScharley 关于git ls-files -z 的输入。

Windows 命令

注意:如果您使用的是 Windows,请使用 Git Bash 运行这些命令

【讨论】:

  • 仅供参考,那个` | tr '\n' ' '` 位是不必要的。
  • @twalberg:你可以使用git ls-files -z
  • @twalberg 如何撤消此命令“git ls-files -z | xargs -0 git update-index --assume-unchanged”
  • @MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged,我想...
  • git ls-files -z | git update-index -z --stdin 更干净。
【解决方案2】:

是的,

git update-index --assume-unchanged

仅适用于文件,不适用于目录。 我认为,一种更快的方法:

cd dir
ls | xargs -l git update-index --assume-unchanged

【讨论】:

  • 不使用cd,您可以将目录作为最终参数传递:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
【解决方案3】:

来自 GNU Findutils 的find 命令有一个-exec 选项,它消除了使用xargs 的大部分麻烦,尽管它的语法有点特殊。但是,它确实可以完美地处理带有空格的文件名。

此命令将使 git 假定列出的目录中和下的所有文件都未更改:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find 获取-exec 之后直到; 的每个参数(你必须逃避,以免你的shell 吃掉它)并为找到的每个文件运行一次,同时替换{} (再次,单引号,所以你的shell 赢了't eat it) 使用找到的文件名。

使用find 的匹配标准(最大递归深度,匹配是文件还是目录,文件名是否匹配表达式)和-exec,您可以做各种强大的事情。

不确定find 命令的其他实现。 YMMV。

【讨论】:

  • -exec is a standard option。你也可以-exec git update-index --assume-unchanged {} +(也是标准定义的)一次将多个文件名传递给命令,减少调用git命令的次数。
【解决方案4】:

将目录名称添加到.git/info/exclude。这适用于未跟踪的文件。

【讨论】:

  • 这项工作很棒!你知道这是否也适用于文件吗?
  • 但这不会推送未跟踪的文件 github!有没有什么可能的方法可以从记录中忽略它们,但实际上将它们保存在存储库中!?
猜你喜欢
  • 2018-03-03
  • 2013-04-27
  • 2011-08-31
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多