3

我最近将 Git 集成到我的工作流程中,它的功能给我留下了深刻的印象。它不仅是一个很棒的 VCS,当通过 ssh 推送时,它还能在 FTP 上运行几圈。不过今天晚上我确实遇到了麻烦,我想知道你们是否可以帮我解决这个问题。

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

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

如果可能的话,我想把所有东西都放在一个提交/推送之下。我的工作流程非常简单(除了这一件事),添加额外的步骤或复杂的因素会让我成为一个悲伤的 Moose。

我不知道它是否有帮助,但我正在使用Tower来帮助管理一切。

4

2 回答 2

2

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

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

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

要使用链接进行设置,您可以将 .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 来仅获取您想要在 prod 中的文件夹。结合使用软链接配置文件,这可能允许您拥有单推工作流,同时在 dev/qa/prod 中维护不同的工作文件夹。见http://briancoyner.github.io/blog/2013/06/05/git-sparse-checkout/

于 2014-06-03T00:24:28.753 回答
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允许您指定要排除的文件的标志。

于 2014-06-03T00:35:12.620 回答