我的项目中有一个特定于服务器的配置文件,因此不希望每次部署时都包含在Git中,因为它会覆盖服务器的设置。为解决这个问题,该文件已从Git中删除...好主意但现在每次部署项目时都会删除服务器配置文件。
所以我现在遇到了问题。我真正想要的是.gitignore
中的文件并且从未添加到项目中,但是一旦添加它,我就无法看到从项目中删除它的方法,而不会触发删除每次部署的现有文件。
我是否可以在不删除项目的情况下从项目中删除文件。有效地回顾性地忽略已经添加的文件?
答案 0 :(得分:0)
您可以在.gitignore
文件中指定不需要的文件。因此Git将忽略对指定文件的任何更改。
如果您没有.gitignore
文件,只需创建它,然后输入要忽略的文件名即可。请记住,将.gitignore
文件添加到存储库后,您必须提交该文件。这将指示Git忽略.gitignore
文件中指定的文件。
简而言之。您在工作存储库中创建名为.gitignore
的文件,并在其中列出要匹配的文件名或模式
例如如果我们想忽略所有.sql
个文件。在.gitignore
我们将输入以下内容:
*.sql
如果我们只想忽略一个文件,请说lib/util.php
。
然后.gitignore
将如下所示:
lib/util.php
您可以根据需要在.gitignore中指定多个文件名。
请注意,只有在@Mark Adelsberger和@torek正确记录的情况下才开始在存储库中跟踪文件时,这将起作用。
答案 1 :(得分:0)
使用git log --oneline
打印提交日志列表,然后启动git reset 'head'
以取消暂存文件。然后,您可以在提交文件之前应用正确的.gitignore模板。
如果您尚未提交文件,则可以使用git rm --cached来取消暂存文件。
您可以从此github页面https://github.com/github/gitignore
答案 2 :(得分:0)
“文件从未签入并且.gitignored”与“文件已签入然后rm-ed并且已经被.gitignored”之间的差异小于您推断的差异。 如果从未添加过该文件并将其放入.gitignore将按预期工作,然后删除了您可以将其放入.gitignore的文件,并且可能在一轮难度之后,它应该开始工作
(例如,如果您使用git pull
来更新服务器,就会出现这种情况。删除文件的提交的 可能会删除该文件 - 尽管它应该显示为冲突。但随后的拉动将忽略该文件,特别是如果你已经将它添加到.gitignore。但我离题了,我在评论中掩盖了我的困惑......)
所以问题是如何从历史中删除文件,好像它从未被添加过,虽然我怀疑它会有所帮助,但是你可以这样做:
您必须“重写”引入该文件的提交(或提交),以及来自此类提交的任何提交。如果这是一个共享存储库,那么在重写之后,每个人都必须转换到重写 - 最容易通过让所有人放弃他们当前的repo并重新克隆来完成。这意味着你必须协调一个“无变化”窗口;如果某人确实在该窗口开头的截止点后进行了更改,则需要将其重新绑定到重写的树中。
现在,如果文件是最近添加的,并且在引入它的提交之后不存在大量历史记录,那么这可能是一个相对简单的过程,您甚至可以采取一些快捷方式。但通用解决方案是使用git filter-branch
或BFG存储库清理程序。
在这两者中,BFG更容易,更快(因为这是它专门设计的任务之一)。它的作者认为唯一安全的过程是从当前提交中手动删除文件,测试当前提交中的所有内容是否按预期工作,然后使用BFG清理历史记录。我认为这是过于迂腐,并向他解释了为什么,但他坚持;所以你必须自己决定。
如果您选择使用filter-branch
,则会使用索引过滤器;它是git过滤器文档中的一个库存示例,所以我只是在那里查找。
答案 3 :(得分:0)
解决此问题的简单而安全的方法是将要排除的文件添加到.gitignore
。
如果文件已被跟踪(之前已添加并已提交),您还需要从存储库中删除它。这可以通过告诉git仅删除跟踪版本而不删除您要保留的本地文件来完成。
git rm --cached <file>
是执行此操作的命令。当您将更改与.gitignore
更新一起提交时,存储库将停止跟踪并开始忽略该文件。