有没有一种方法可以将文件保存在GIT存储库中并在本地删除它而无需提交删除操作?

时间:2020-08-05 17:43:41

标签: git gitignore

我对项目有一个特殊要求,即在提交后将其添加到install的远程存储库中保留一个名为.gitignore的文件夹。仅在设置应用程序时需要此文件夹,安装后必须将其删除。是否可以在不提交删除的情况下从本地存储库中删除此install目录?该文件夹必须在远程存储库中可用,但是在首次设置之后,必须删除该目录。

2 个答案:

答案 0 :(得分:2)

git的目的是管理工件的版本控制。那可能是代码,图像,二进制文件。甚至可能是发布工件,尽管这有点棘手,而且Git不一定最适合。

这里的问题是,您似乎正在进行两种不同的活动

  1. 下拉并安装最新版本的东西
  2. 从事那件事或事后使用它

如果对该要求给出了我的要求,则我的要求是,上述两种不同的活动需要不同的方法,并且不应位于同一回购中。开发和发布是分开的,需要使用不同的流程(有时使用不同的工具)进行处理。

通常,您从开发存储库中创建某种安装程序包或分发,该安装程序包或发行版是根据存储库中的数据构建的。为了分发,您可以将软件包分发保存在某个地方,例如用于Node.JS的npm软件包存储库,或用于Python的PyPi。或者,您可以通过发布方式(例如,Github上的“发布”页面)为您的存储库分发软件包,或为发行版构建的特殊存储库,例如Artifactory或Docker Trusted Repo(更多关于Docker Containers ...)。

您也可以按照要求存储发行版,但是通常情况下,您将有一个单独的存储库来存储发行版,因此开发人员在获取最新提交时不必下载最新发行版。无论何时创建发行版,都应将安装文件放入该存储库的文件夹(例如本地install文件夹)中,并推送新的提交。然后人们可以克隆该文件或直接从该存储库进行安装(即直接从远程安装存储库的Github页面下载文件)。

但是,尽管仍然有点怪异,但有可能在发布文件夹所在的地方有一个单独的分支,但是在主dev或master分支中却没有。如果您没有选择或能力提出更好的解决方案,那就是我要走的路。

答案 1 :(得分:1)

已经有了另一个很好的答案,但是我想直接解决这个问题:

是否可以在不提交删除的情况下从本地存储库中删除此安装目录?

否-当您考虑Git实际存储的内容时,很容易看到为什么

每个提交及其唯一的哈希ID号实际上以特殊的只读方式(临时冻结)存储 所有文件作为快照。 ,仅用于Git的重复数据删除格式。 1 因此,这些提交是独立存在的:您实际上不需要以前的提交,这就是Git允许浅层克隆的方式存在。 2

要进行新的提交,您需要Git重新保存每个文件(已重复数据删除,因此所有未更改的文件都将重新使用上一个文件)。要进行一个不包含某些文件(install/*)的提交,您必须进行一个不包含文件的提交。也就是说,您必须提交删除。 要做的提交将保留在存储库中,并且任何人将来任何时候都应提交包含与这些install/*文件之一(Git)完全匹配的文件的提交将自动对其进行重复数据删除。

请参见LightCC's answer,以解决您当前无法做的事情,这会造成一些痛苦。


1 从技术上讲,它们是松散对象,它们是类型blob的Git对象,它们只是文件的zlib压缩形式,带有前缀-您可以使用zlib-decompressor以各种语言阅读这些内容,然后跳过标头-或打包对象,然后使用delta压缩,因此很难阅读。 Git保留自己将来更改内部存储格式的权利,因此通常最好只让Git提取对象,然后将其转换为普通的日常文件。

2 浅表克隆仍然很棘手,特别是当从浅表克隆 pushing 时,Git可能不会意识到其他一些Git已经有很多文件,并且会重新发送它们,并迫使另一个Git重新复制它们。