如何告诉git(或其他一些dvcs)私下跟踪文件?

时间:2010-08-18 18:15:38

标签: git dvcs

我的用例从很像this的东西开始;一个团队使用一个中央存储库(在我的情况下它是颠覆,但我相信如果它是git,问题将是相同的),并且一些文件是成员私有(Django本地设置文件,IDE私有项目首选项等) 。虽然私有文件应保持私有 - 也就是说,我不希望我对其进行推送或提交的更改 - 我确实希望跟踪文件并控制版本。

最好的选择是默认保持文件私有的方法;一种解决方法是保持私有提交的一种方法 - 必须记住单独提交私有文件会令人讨厌,但仍然比根本无法跟踪它更好。

与建议的解决方案相比: thisthis并不好,因为它们会阻止文件的提交;这不是我想要的。我希望它在当地承诺;我只是不想发布它。

顺便说一句 - 虽然我喜欢DVCS,而且git是一种默认,但我并不觉得特别致力于此(双关语无意);如果只有hg或bzr可以做到这一点,那么我可能有理由转换。

7 个答案:

答案 0 :(得分:2)

我管理这个的方式,我不知道在你的情况下这是否合适,就是创建一个模板文件,例如settings.txt.template,它位于已提交的仓库中。然后在本地设置您的个人文件(将settings.txt添加到.gitignore文件中)。

否则你可能会看一下git子模块http://book.git-scm.com/5_submodules.html

答案 1 :(得分:2)

如何使用用户首选项忽略子文件夹?类似于schoetbi建议,但只是一个文件夹,而不是每个用户一个文件夹。

/Project
    /Foo
    /Bar
    /Preferences

在/Project/.gitignore中,要忽略的行/Preferences / Project / Preferences。并在/ Project / Preferences中初始化一个'秘密'回购。 (我把它称为秘密,因为外部回购不知道它。)如果其他软件期望其主要仓库部分中的某个特定文件,您可以在/ Project / Preferences中创建一个符号链接夹。符号链接可以跟踪或不跟踪;随着时间的推移它应该大部分是稳定的,所以你不会关心它的历史,它的历史无论如何都会独立于主项目,所以我可能会忽略它。

你不需要/ Project下面的/ Preferences,但是它必须位于相对于/ Project的一个位置才能使符号链接工作正常工作,所以我会将它保留在下面。只要外部存储库忽略内部存储库,就可以在另一个存储库下初始化存储库。我用〜文件夹和项目在我的〜文件夹下面做这个。

即使您可能逻辑上希望将您的用户首选项链接到您在主仓库中进行的某些提交,但这对git来说根本不可能,因此您肯定不得不在提交之间进行手动同步。您的主要回购以及与秘密回购中的提交相关的首选项。 Git从根本上关心整个仓库的状态(这意味着它正在跟踪的一切),它永远不会提交部分提交。 (因为如果你取出一个文件,提交的SHA-1哈希标识就完全不同了。)

答案 2 :(得分:1)

我建议有一个设置文件夹,下面是每个用户的文件夹。如果你有一个像样的操作系统,那么有一个环境变量,其中包含登录用户的名称。

您的目录结构将是:

Project
 / Settings
   / User1
   / User2
   / User3

现在一切都已签入,每个用户都有自己的目录。下一步是使用buildscript,projectfiles和脚本中的用户特定部分或任何使用环境变量的部分。

答案 3 :(得分:1)

执行此操作的一种肮脏的hackish方式是将私有文件保留在与主项目内容不同的版本控制系统下。例如,忽略.gitignore中的首选项文件,但在目录中创建Mercurial存储库,忽略除首选项文件之外的所有内容。这至少可以让您跟踪每组文件中的更改,但不允许将其中一个文件与另一个文件相关联。

答案 4 :(得分:1)

也许您可以将文件存储在单独的git文件夹中并使用.gitignored的符号链接?

答案 5 :(得分:0)

或者,也许,告诉git忽略此文件中的更改:

git update-index --assume-unchanged <file name>

答案 6 :(得分:0)

mine为git执行此操作,如果为*_mine_*添加全局svn忽略规则,它应该适用于svn。

免责声明:默认情况下它不是版本,但可以让您备份和恢复符合*_mine_*忽略规则的任何内容