git update-index-假定目录未更改


101

git 1.7.12

我想将给定目录下的所有文件标记为假定不变。

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

2)git update-index --assume-unchaged dir/*快速失败,因为它将遇到未被跟踪的文件,因此显示“致命:无法标记文件”并退出。

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

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

Answers:


174

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运行这些命令


2
仅供参考,tr'\ n'''`位是不必要的。
瓦茨拉夫·斯拉维克

7
@twalberg:您可以使用git ls-files -z
Matthew Scharley,

2
@twalberg如何撤消此命令“ git ls-files -z | xargs -0 git update-index --assume-unchanged”
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged,我想...
twalberg

1
git ls-files -z | git update-index -z --stdin更干净。
杰德

22

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

此命令将使git假定所列目录中及其下的所有文件均未更改:

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

Find会使用每个参数,-exec直到;(您必须转义,以免shell吃掉它)并为找到的每个文件运行一次,然后用{}找到的文件名替换(同样,用单引号引起来,shell不会吃掉它)。

使用find的匹配条件(最大递归深度,无论匹配是文件还是目录,文件名是否匹配表达式),-exec您都可以执行各种强大的功能。

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


2
-exec是标准选项。您也可以-exec git update-index --assume-unchanged {} +(也由标准定义)一次将多个文件名传递给命令,以减少git命令被调用的次数。
汤姆·费内奇

16

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


这项工作很棒!您知道这是否也适用于文件吗?
betomoretti

但是,这不会将未跟踪的文件推入github!有什么可能的方法只是从记录中忽略它们,而实际上将它们保留在存储库中!?
Mahmoud Zalt

2

是的

git update-index --assume-unchanged

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

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

2
cd可以使用dir作为最终参数来代替使用git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
KZH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.