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

hal*_*leo 31 git version-control repository

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

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

我怎样才能用git实现这个目标?我可以配置一个" .gitignore-for-push"文件吗?我无法使用本地.gitignore文件,因为它会完全排除这些文件被跟踪.

ps:我知道问题是否有一个排除文件等效的...,但答案沿着.gitignore我无法使用的路径走下去.另一个问题在推送时排除特定文件...只回答git + heroku的特定情况,而不仅仅是git.

red*_*nce 33

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

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

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

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

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

  • 这样做的缺点是它不会跟踪文件的更改;但了解该选项很有用。 (2认同)

dun*_*nni 13

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

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

  • 是的,我之前就怀疑过这一点。“子模块”的有趣想法 - 我会检查一下。我当前的解决方案虽然使用第二个目录(请参阅我的答案http://stackoverflow.com/a/12019595/65889) - 我知道这是一种作弊。 (2认同)

hal*_*leo 6

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

例如,在您的主文件夹(~)中存在.creds希望在公共存储库中的文件.移动这个文件称为子文件夹,说protected从创建符号链接~protected/.creds..当然,不包括在此文件夹~存储库,但创建一个新的库文件夹中protected只跟踪.creds.如果您根本没有公开推送此存储库,那么您已经设置好了.

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


Sir*_*dda 6

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

git update-index --assume-unchanged <PATH_OF_THE_FILE>
Run Code Online (Sandbox Code Playgroud)

例子:-

git update-index --assume-unchanged somelocation/pom.xml
Run Code Online (Sandbox Code Playgroud)

更多细节。