2011-01-09 93 views
3

我有我的网站/ cms在git中跟踪和它工作得很好,除了我的.htaccess文件。该文件需要根据我在哪个服务器上运行代码(本地/测试/实时)而大不相同。因此,现在我已经完全保留了.htaccess的完整版(它位于我的.gitignore文件中)。但偶尔它会丢失,无论如何它都是网站的一部分,我希望它能够保持跟踪,但我不希望它被推送到远程存储库,因为它可能会覆盖其他服务器的正确配置。有什么办法让git保持一个文件的跟踪,但只有本地? (或任何其他方式来解决这个问题?)git版本控制文件在存储库没有推/拉

回答

2

你可以用Git的sparse checkout功能来做到这一点。在你想有一个特殊的,未追踪.htaccess文件回购运行以下命令:

git config core.sparsecheckout true 
echo '*' >.git/info/sparse-checkout 
echo '!.htaccess' >>.git/info/sparse-checkout 
git read-tree --reset -u HEAD 

这将首先删除现有.htaccess文件。但是现在它从Git的角度来看就被忽略了,所以你可以在那里放置一台特定的机器,Git不会为此烦恼。

然后,您可以添加和管理.htaccess文件从一些其他存储库(说你的本地之一)。 Git很乐意跟踪这个文件并将其保存在存储库中,但在具有上述稀疏结帐配置的计算机上,Git将忽略该工作目录中的本地.htaccess文件,即使它与存储库中的文件不同。

+0

但是,这并不会让Git跟踪文件,这是OP所需的一部分。 – Amber 2011-01-09 07:25:56

0

保持你的.htaccess在一个完全独立的Git仓库,并在你的代码是在目录符号链接它(并保持它.gitignore倒是在原来的仓库。)

0

您可能有多个分支,每个服务器一个分支,以便每个分支都有自己版本的服务器特定配置文件。然后,当您在主分支中进行更改时,其他分支将与其合并并获取最新更改 - 但他们会保留自己的配置。如果配置文件发生了变化,那么就需要手动合并,否则这可以通过脚本甚至githooks来实现。

1

听起来像.htaccess文件的内容是特定于部署的,因此不是代码的一部分。换句话说,这些文件可以由部署脚本生成以适应每个服务器,而不是保存在git中,然后每次提交时都必须覆盖更改。

0

如果这是一个安全问题,答案将是“否”,因为如果git跟踪文件的历史记录,克隆该存储库的每个人都将获得完整的历史记录。但是,如果您可以控制所有位置,只需要一种方式来跟踪它,但是在其他位置以避免检查它,也许git smudge和git clean filters可能会为您做些事情。它们允许您在检出并提交时编辑文件的内容。我不确定这是否合适,但我试图想出一个可行的解决方案。

或者,使用替代名称(即不是“.htaccess”)跟踪文件,并且在适用的情况下,只有在适用的情况下,创建名为.htaccess的符号链接才能跟踪名称。