推送到远程服务器,同时排除一些提交文件?

时间:2014-06-02 23:54:09

标签: git git-tower

我最近将Git集成到了我的工作流程中,并且我对其功能印象深刻。它不仅是一个伟大的VCS,它在通过ssh推送时围绕FTP运行。我今晚确实遇到了麻烦,我想知道你是不是很好的人可以帮我解决它。

我希望跟踪项目中的某些文件,但不想推送到生产环境。有没有办法在从repo中排除某些文件时推送到生产服务器?两个很好的例子:

  • 。无文件根本不需要在生产服务器上,但绝对应该仍然被跟踪
  • 由于我的本地和生产环境在不同的域下运行,.htaccess文件略有不同。我仍然希望跟踪这些,因为大多数规则都是通用的(如果丢失则重写很痛苦) - 但每次我推送我的本地.htaccess实时,它会破坏我的生产环境,我必须手动修复文件。

如果可能的话,我希望将所有内容保持在一次提交/推送之下。我的工作流程非常简单(除了这一件事),添加额外的步骤或复杂的因素会让我感到悲伤。

我不知道它是否有帮助,但我使用Tower来帮助管理所有内容。

2 个答案:

答案 0 :(得分:2)

我没有一个非常棒的解决方案,所以我会给你一些选择。

首先,我通过使用单独的分支进行生产,qa和dev来解决类似的情况。这确实违反了你对“单一推动”的渴望。

其次,如果您真的想将所有内容保存在一个分支中,您可以使用另一种常用技术,即使用.gitignore排除特定文件,但通过软链接链接到每个工作目录中的文件。变化的文件。大多数操作系统都支持链接,包括OSX,类Unix(Linux,FreeBSD等)和Windows NTFS,通过MKLINK命令。

要设置使用链接,您可以将.htaccess文件重命名为.htaccess-dev,然后将其复制并更新到.htaccess-dev,.htaccess-qa以适用于所有环境。然后,将.htaccess添加到.gitignore,最后在每个环境中创建指向正确环境的软链接。

例如,如果您的DEV系统是Windows,您会看到如下内容:

C:\code\dev-example>ren .htaccess .htaccess-dev

C:\code\dev-example>mklink .htaccess .htaccess-dev
symbolic link created for .htaccess <<===>> .htaccess-dev

C:\code\dev-example>dir
 Volume in drive C is Boot
 Volume Serial Number is DC8C-D5C9

 Directory of C:\code\dev-example

06/02/2014  06:12 PM    <DIR>          .
06/02/2014  06:12 PM    <DIR>          ..
06/02/2014  06:09 PM                10 .gitignore
06/02/2014  06:09 PM    <SYMLINK>      .htaccess [.htaccess-dev]
06/02/2014  06:08 PM                22 .htaccess-dev
06/02/2014  06:12 PM                23 .htaccess-prod
               4 File(s)             55 bytes
               2 Dir(s)  13,497,245,696 bytes free

C:\code\dev-example>type .htaccess
# Config file for DEV

C:\code\dev-example>type .gitignore
.htaccess

这种方法适用于一些不同的配置文件,但是如果你有很多这样的文件就会变得笨拙,而且它并没有真正解决你想要排除.less文件的问题。

最后,如果您可以重新组织项目以将仅开发代码分隔到单独的文件夹中,则可以在生产服务器上使用git sparse-checkout来仅获取所需的文件夹。结合使用软链接配置文件,这可能允许您在dev / qa / prod中维护不同的工作文件夹时使用单推工作流程。见http://briancoyner.github.io/blog/2013/06/05/git-sparse-checkout/

答案 1 :(得分:1)

在Git中无法推送没有特定文件的提交。提交由它的变更集的哈希值和它所基于的提交(它是变更集和先前提交的哈希)来标识。排除文件会更改至少一个更改集,这反过来会更改哈希值(除非您碰巧遇到相同的哈希值,但这种情况非常罕见,几乎不值得一提)。

但是,如果可以排除在生产环境中检出文件。它们仍然在生产机器上,但在那里的本地存储库的Git索引内压缩,它们几乎不占用任何空间而且不会干扰任何东西。

为了实现这一点,您需要能够在您将要推送到的生产环境中的裸存储库上设置挂钩。推送后,您需要使用此命令:

git archive --remote <path-to-bare-repo> --format tar <branch-to-checkout> | tar --extract --directory <path-to-extract> --exclude <pattern-of-files-to-exclude>

此命令将创建分支当前树的tar归档表示,而不是常规签出。该存档通过tar传输,以将其转换为光盘上的实际文件。 tar接受--exclude标记,该标记允许您指定要排除的文件。