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 中有两个文件 a
和 b
,但您只想提交其中一个,请使用:
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