git - 是不是可以从“git push”中排除文件,但将它们保存在本地存储库中?

Posted

技术标签:

【中文标题】git - 是不是可以从“git push”中排除文件,但将它们保存在本地存储库中?【英文标题】:git - Is it possible to exclude file from `git push`, but keep them in the local repository?git - 是否可以从“git push”中排除文件,但将它们保存在本地存储库中? 【发布时间】:2012-08-07 09:42:19 【问题描述】:

在我的主目录中,我在本地 git 存储库中有文件,因为我想在版本控制下跟踪它们。

我希望将这些文件中的大部分推送到远程存储库,但我只想将一些文件保留在我的本地存储库中(它们包含轻度敏感信息)。

如何使用 git 实现这一点?我可以配置“.gitignore-for-push”文件吗?我不能使用本地的.gitignore 文件,因为它会将这些文件完全排除在跟踪之外。

ps:我知道Is there an exclude file-equivalent... 的问题,但答案是我无法使用的.gitignore 路径。另一个问题Exclude specific files when pushing... 只回答了 git+heroku 的特定情况,而不是单独的 git。

【问题讨论】:

我不这么认为。您最好使用git submodule 将您的敏感信息远离远程存储库。 【参考方案1】:

这是不可能的。如果你已经提交了一个文件,那么它将被推送。推送操作仅对提交起作用,而不是基于文件。

但是您可以为敏感数据使用子模块,并将此子模块保留在本地计算机上,同时将常规 git 存储库推送到远程计算机。

【讨论】:

是的,我事先就怀疑过这一点。 submodule 的有趣想法 - 我会检查一下。我目前的解决方案虽然使用第二个目录(请参阅我的答案***.com/a/12019595/65889) - 我知道这是一种作弊。【参考方案2】:

只是不要提交您要排除的文件。

例如,如果您在本地 repo 中有两个文件 ab,但您只想提交其中一个,请使用: git add a 添加文件之一。然后使用git commit 提交(不要包含-a 标志)

【讨论】:

这将完全防止文件处于版本控制之下,这对于大多数配置文件、敏感代码等来说充其量是一个糟糕的解决方案。git submodule 可能是一个更好的解决方案【参考方案3】:

您可以继续实际跟踪这些文件(不包括敏感信息),然后使用:

git update-index --assume-unchanged <file>

在每个文件上。然后您可以继续将敏感信息添加到每个文件中,但 Git 不会看到文件已更改,并且不会尝试提交(并因此推送)该敏感信息。

要让 Git 再次更新信息,您可以使用:

git update-index --no-assume-unchanged <file>

【讨论】:

这有一个缺点是它不会跟踪对文件的更改;但了解该选项很有用。 我正在寻找一种方法来忽略本地文件而不修改存储库或 gitignore 文件(这会影响其他人)。我尝试修改全局 git ignore 配置和 .git/info/exclude 下的这个文件。两者都不起作用,但这确实起作用了。谢谢!【参考方案4】:

我最终解决该问题的方法如下:将敏感信息放在具有自己的 git 存储库的子目录中,并将文件符号链接回旧位置。

例如在您的主文件夹 (~) 中保存着 .creds 文件,您想要在公共存储库中。将此文件移动到名为 protected 的子文件夹中,并创建一个从 ~protected/.creds. 的符号链接当然,不要将此文件夹包含在您的 ~ 存储库中,而是创建一个 new 文件夹protected 中的存储库只是为了跟踪.creds。如果您根本不公开推送此存储库,那么您已经设置好了。

我知道这个解决方案有点逃避现实:我的问题表明该文件位于同一目录中,但符号链接对我有用。

【讨论】:

【参考方案5】:

这里 git-update-index - 将工作树中的文件内容注册到索引。

git update-index --assume-unchanged <PATH_OF_THE_FILE>

例子:-

git update-index --assume-unchanged somelocation/pom.xml

for more details.

【讨论】:

【参考方案6】:

git update-index --skip-worktree 目录/fileName.js

这将修改索引或目录缓存。提到的每个文件都会更新到索引中,并且任何未合并或需要更新的状态都会被清除。 如需更多参考,您可以浏览以下网址。 https://git-scm.com/docs/git-update-index

【讨论】:

虽然这可能是问题的答案,但最好解释一下这个命令的作用。一般不接受纯代码答案。

以上是关于git - 是不是可以从“git push”中排除文件,但将它们保存在本地存储库中?的主要内容,如果未能解决你的问题,请参考以下文章

git push 在 bash 中使用 ssh-agent 但不是 gui

Git push - 似乎不是 git 存储库(ssh 指向错误的目录)

git push之后服务器如何自动更新?

git push出现403错误怎么办

git push/pull 对应分支

AWS Elastic Beanstalk 交换环境 URL 是不是为 git push 交换环境?