忽略git提交中的文件,但保护它免受清理

10

在我的工作树中,我有一些被.gitignore忽略的文件:

  1. 构建输出(Build outputs)
  2. 不应该成为仓库一部分的敏感文件(例如密码、本地服务器连接详细信息等)

如果我想要从头开始重建项目,我可以使用 git clean -x来删除(1)中的构建输出。但是这也会删除(2)中的敏感文件。

是否有一种方法可以标记一个文件,使其不受git clean影响,同时仍然被git commit忽略?


我认为没有标记文件的方法,你需要在运行清理命令时明确地将其排除在外:https://dev59.com/ZGgu5IYBdhLWcg3wxZzd - Rob
1
GNU Arch曾经(虽然现在仍在使用,但已经没有人再使用它了)用于区分“垃圾”和“重要”文件,以达到精确的目的。不幸的是,其他版本控制系统没有添加这种区别。 - Jan Hudec
-X选项怎么样? - Bittu Choudhary
3个回答

9
git-clean 的文档表示,-x 参数的含义如下:

-x

不使用来自 .gitignore(每个目录)和 $GIT_DIR/info/exclude 的标准忽略规则,但仍然使用使用 -e 选项提供的忽略规则。

因此,如果你想保留例如 keys.pem,你需要调用以下命令:
git clean -fdxe keys.pem

您还可以为命令创建别名


1
这很好...在我的情况下,我想要保留的文件恰好匹配一个模式,所以我使用以下命令: git clean -nxd -e ".*" - Tim Robinson

0

交互模式中使用git clean

选择按模式筛选子命令:

这将显示要删除的文件和目录,并发出“输入忽略模式>>”提示。您可以输入以空格分隔的模式,以从删除中排除文件和目录。例如,“*.c *.h”将从删除中排除以“.c”和“.h”结尾的文件。当您对筛选结果满意时,请按ENTER(空)返回主菜单。


0

看一下这个问题答案,来自@Borealid,关于Git - Difference Between 'assume-unchanged' and 'skip-worktree'

使用skip-worktree标志似乎是解决我的问题的好方法。我通过寻找答案来到你的问题,我认为它们本质上是相同的问题。然而,使用skip-worktree标志时,在执行某些操作并且文件已经在本地或远程更改时,仍需要注意

在了解skip-worktree标志之前,我能想到的最好的解决方案是使用.gitignore加上git clean的别名。这有点像黑客行为,但如果您唯一的选择是使用git clean的排除选项,那么这可能会有所帮助。

  1. 给你要修改但不想提交的任何文件添加一致且独特的前缀和/或后缀。例如,在文件名前面添加 myusername.
  2. 始终使用 git clean -dx --exclude=myusername.*(为此创建一个别名)。
  3. 编写一个递归遍历文件并将以 myusername. 开头的文件复制到没有 myusername. 的文件中的脚本。

现在,每当您运行清理时,具有所需/真实文件名的文件被清除,但是您可以通过运行脚本来恢复它们。此外,请将真实文件名的文件视为只读。始终编辑带有 kludged 文件名的文件,然后运行脚本。

结合使用 skip-worktree 标志时,这些组合也可能有助于减轻边缘情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接