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

时间:2012-08-10 04:58:43

标签: git version-control repository

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

我希望将这些文件中的大多数推送到远程存储库,但有一些我想将仅保留在我的本地存储库中(它们包含温和敏感的信息)。

如何使用git实现这一目标?我可以配置“.gitignore-for-push”文件吗?我无法使用本地.gitignore文件,因为它会完全排除这些文件被跟踪。

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

5 个答案:

答案 0 :(得分:29)

您可以继续实际跟踪这些文件(没有敏感信息),但随后使用:

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

在每个文件上。然后你可以继续将敏感信息添加到每个文件中,但是Git不会将文件视为已更改,也不会尝试提交(从而推送)该敏感信息。

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

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:6)

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

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

我知道这个解决方案是一种警察:我的问题表明该文件位于同一目录中,但符号链接适用于我。

答案 3 :(得分:3)

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

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

实施例: -

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

for more details.

答案 4 :(得分:0)

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

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