Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不删除的情况下将文件添加到.gitignore中?_Git_Gitignore - Fatal编程技术网

如何在不删除的情况下将文件添加到.gitignore中?

如何在不删除的情况下将文件添加到.gitignore中?,git,gitignore,Git,Gitignore,我的项目中有一个特定于服务器的配置文件,因此不希望包含在Git中,因为每次部署时它都会覆盖服务器的设置。要解决此问题,文件已从Git中删除。。。好主意,但是现在每次部署项目时,服务器配置文件都会被删除 所以我现在遇到了一个问题。我真正想要的是文件位于.gitignore中,并且从未添加到项目中,但是一旦添加了它,我就无法找到一种方法将其从项目中删除,而不在每次部署时对现有文件进行删除 有没有什么方法可以从项目中删除文件而不删除它。是否有效地忽略已添加的文件?您可以在.gitignore文件中指定

我的项目中有一个特定于服务器的配置文件,因此不希望包含在Git中,因为每次部署时它都会覆盖服务器的设置。要解决此问题,文件已从Git中删除。。。好主意,但是现在每次部署项目时,服务器配置文件都会被删除

所以我现在遇到了一个问题。我真正想要的是文件位于
.gitignore
中,并且从未添加到项目中,但是一旦添加了它,我就无法找到一种方法将其从项目中删除,而不在每次部署时对现有文件进行删除


有没有什么方法可以从项目中删除文件而不删除它。是否有效地忽略已添加的文件?

您可以在
.gitignore
文件中指定不需要的文件。因此Git将忽略对指定文件的任何更改

如果没有
.gitignore
文件,只需创建它,然后键入要忽略的文件名。请记住,将
.gitignore
文件添加到存储库后,必须提交该文件。这将指示Git忽略
.gitignore
文件中指定的文件

简而言之。在工作存储库中创建一个名为
.gitignore
的文件,并在其中列出要匹配的文件名或模式 e、 g.如果我们想忽略所有
.sql
文件。在
.gitignore
中,我们将键入以下内容:

*.sql
如果我们只想忽略一个文件,让我们假设
lib/util.php
。 然后,
.gitignore
将如下所示:

lib/util.php
您可以根据需要在.gitignore中指定多个文件名

请注意,只有在@Mark Adelsberger和@torek正确指出文件从未在存储库中跟踪的情况下,这才有效。

使用
git log--oneline
打印提交日志列表,然后启动
git reset'head'
来取消文件的保存。然后可以在提交文件之前应用正确的.gitignore模板。 如果尚未提交文件,可以使用git rm--cached取消文件的保存。 您可以在此github页面上找到gitignore模板的集合

与“文件从未签入且为.gitignored”相比,“文件已签入,但随后rm已删除且此后一直为.gitignored”的差异小于您的推断。如果从未添加该文件并将其放入.gitignore中,则会像预期的那样工作,那么删除该文件后,您可以将其放入.gitignore中,并且在可能的一轮困难之后,它应该开始工作

(例如,如果您使用
git pull
更新服务器,情况就是这样。删除文件的提交的pull可能会删除该文件-尽管它会显示为冲突。但是后续的pull会忽略该文件,特别是如果您将其添加到.gitignore中。但是我离题了,我已经在这里讲述了我的困惑。)在评论中……)

因此,问题是如何从历史记录中删除一个文件,就好像它从未被添加过一样。尽管我怀疑它是否会有帮助,但以下是您可以做到的:

您必须“重写”引入文件的提交(或多个提交),以及从此类提交派生的任何提交。如果这是一个共享存储库,则在重写之后,每个人都必须转换到重写-最简单的方法是让每个人放弃其当前repo并重新克隆。这意味着您必须协调“无更改”窗口;如果有人在该窗口开始处的截止之后进行了更改,则需要将其重新设置到重写树中

现在,如果文件是最近添加的,并且在引入它的提交之后没有太多的历史记录,那么这可能是一个相对简单的过程,您甚至可以采取一些快捷方式。但是一般的解决方案是使用
git filter branch
或BFG存储库清理器

在这两项任务中,BFG更容易、更快(因为这是它专门设计用来解决的任务之一)。其作者认为唯一安全的过程是手动从当前提交中删除文件,测试当前提交中的所有内容是否按预期工作,然后使用BFG清理历史记录。我认为这过于迂腐,并向他解释了原因,但他坚持;因此,你必须自己下定决心


如果您选择使用
过滤器分支
,您将使用索引过滤器;这是git过滤器文档中的一个常见示例,因此我只需在那里查找。

解决此问题的简单而安全的方法是将要排除的文件添加到
。gitignore

如果文件已经被跟踪(以前添加并提交),您还需要将其从存储库中删除。这可以在不删除本地文件的情况下完成,您可以通过告诉git仅删除跟踪的版本来保留本地文件


git rm--cached
是执行此操作的命令。当您随
.gitignore
更新一起提交更改时,存储库将停止跟踪并开始忽略该文件。

您是如何部署的?既然您只提到git,我可以推断您是通过git拉动进行部署的;但这不应该像您描述的那样ed.删除文件的提交的拉取可能会删除该文件(不过,如果本地文件与git中的最后一个版本不匹配,则应显示为冲突);但在此之后,一旦文件恢复原位,后续的拉取(与文件没有关系的提交)不应影响该文件。该文件应显示为“untracked“除非您.git忽略它。也就是说……由于您描述的行为与git应该做的不同,我怀疑您正在使用其他方法进行部署。但是如果您使用其他方法进行部署,那么文件曾经在git中