我在开发新网站时一直在使用Git / Beanstalk,并且它已经创造了将更改从本地服务器推送到Staging Server的奇迹。我现在正处于我想要使用生产服务器“实时”的地步,并且想知道正常的程序是什么(许多其他链接不包括这个......)。
我想从这个新的生产服务器开始“新鲜”,而不是推动我在过去6个月内从Staging服务器进行的数千次更改。有没有办法做到这一点?我只是创建一个新的回购,摆脱旧的回购,等等?如何清除历史记录,以便它只是简单地获取登台服务器上的内容并将其推送(或者从本地服务器推送)。我使用Tower所以我知道Git几乎没有遇到麻烦(命令行不是我的事情)。你能把所有东西都包起来说“这是版本1.0,让我们从这里开始”吗?
另外,当忽略缓存文件和图像等时,我有点懒惰。我可以在事后轻松添加这些.gitignore文件吗?
答案 0 :(得分:4)
请注意,Beanstalk只会部署最新版本的文件(或者如果您需要任何其他版本)。因此,当您添加生产服务器时,Beanstalk会将当前存储库中的所有文件上载到生产服务器。
它不会通过更改来部署它,因此任何“历史记录”都不会减慢速度或使用任何空间。
答案 1 :(得分:3)
正如Adrian所说,这不是一个真正的问题,除非你在Git中有大量二进制文件不应该(例如图像上传等)。就个人而言,我不会把我的历史记录下来,因为它对于调试是非常宝贵的,尽管我对我的承诺以及经常做的事情都非常自律。
如果您要从之前添加的repo中删除文件,但想要保留本地副本,请执行以下操作:
git rm --cached / path / to / remove
这将从索引的当前状态中删除它们,但保留实际文件,然后可以将其添加到.gitignore。这对于您仅错误地添加到git的文件,或者对于不太关注repo大小或安全性的小文件来说非常方便。
但是,如果您之前已经提交了这些文件,它们仍会在您的历史记录中,因此您的总回购邮件大小可能会夸大(例如,如果您在过去添加了PSD或某些大图片。如果您想完全从您的历史记录中删除文件(如果敏感数据以某种方式悄悄地移动,也很方便):
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <NAME OF FILE>' --prune-empty --tag-name-filter cat -- --all
此命令将运行每个分支和标记的整个历史记录,更改涉及您指定的文件的任何提交,以及之后的任何提交。之后呈现空的提交(因为它们仅更改了Rakefile)将被完全删除。 警告:它也会覆盖您现有的代码。
删除文件后,您可能需要强制推送更改:
git push <remote> <branch> --force
但是你想要确保你在那时做正确的事情,因为你也会覆盖遥控器上的历史记录,那时它真的会消失。如果沿着这条路走下去,有一个很好的,更详细的教程here。
当你使用Beanstalk时,这不是一个主要问题,因为它只会部署你文件的最新版本而不是整个回购/历史。
答案 2 :(得分:2)
除非你的git存储库真的很大(因为你不小心添加了一堆媒体文件),所以这样做几乎没有意义。版本控制的重点是保留更改历史记录,以便您可以回顾并查看添加内容的时间和原因。没有教程覆盖这个的原因是因为它通常不是你通常使用git的方式。
我能看到你想要这样做的唯一原因是你添加了一大堆不属于git(大型媒体文件,缓存等)的文件,这些文件已被删除并且需要很长时间推送到您的生产服务器(因为您提到您忘记以.gitignore
文件开头)。所有文本文件都是用git压缩的,所以不必担心你做了多少次提交(相比之下,PHP source code有超过70,000次提交,可以追溯到14年,linux kernel已经结束了300,000次提交,以及许多其他成功的开源项目也是这样的 - 所以即使你已经做了1000次提交,你几乎没有抓到git可以处理的表面)。
在这种情况下,您正在谈论的是擦除整个历史记录并创建一个新的空白git存储库。您需要做的就是删除/.git
目录,并初始化一个新目录(从Tower或命令行git init
)。
请注意,如果您创建一个新的存储库,然后尝试推送到您的临时服务器,则需要使用--force
选项,否则它会抱怨您正在尝试重写历史记录(您就是这样)。单击“推送”时,塔具有类似的强制复选框。
您可以在事后添加.gitignore
个文件。但是,请记住,这不会删除您之前添加到存储库的任何文件。因此,最好避免首先提交文件,否则它们会永久存在于您的存储库历史记录中(有一些方法可以重写历史记录并正确删除所有文件的痕迹,即使是旧的提交,但它们很难超出范围这个答案)。