如何让git(或其他DVC)私下跟踪文件?

如何让git(或其他DVC)私下跟踪文件?,git,dvcs,Git,Dvcs,我的用例从一个非常类似的东西开始;一个团队使用一个中央存储库(在我的例子中是subversion,但我相信如果是git,问题也会一样),并且一些文件是成员私有的(Django本地设置文件、IDE私有项目首选项等)。虽然私有文件应该保持私有--也就是说,我不希望对其所做的更改被推送或提交--但我希望跟踪该文件并控制其版本 最好的选择是在默认情况下保持文件的私有性;解决方法是保持私有提交的一种方法——必须记住单独提交私有文件会很麻烦,但总比根本无法跟踪要好 与建议的解决方案相比: 和不好,因为它们根

我的用例从一个非常类似的东西开始;一个团队使用一个中央存储库(在我的例子中是subversion,但我相信如果是git,问题也会一样),并且一些文件是成员私有的(Django本地设置文件、IDE私有项目首选项等)。虽然私有文件应该保持私有--也就是说,我不希望对其所做的更改被推送或提交--但我希望跟踪该文件并控制其版本

最好的选择是在默认情况下保持文件的私有性;解决方法是保持私有提交的一种方法——必须记住单独提交私有文件会很麻烦,但总比根本无法跟踪要好

与建议的解决方案相比: 和不好,因为它们根本阻止提交文件;这不是我想要的。我希望它在当地实施;我只是不想让它出版


顺便说一句——虽然我喜欢DVCSs,而且git已经是一种默认设置,但我并不觉得自己对它有特别的投入(双关语,意料之外);如果只有hg或bzr可以做到这一点,这可能是我切换的充分理由。

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

您的目录结构将是:

Project
 / Settings
   / User1
   / User2
   / User3

现在,所有内容都已签入,每个用户都有自己的目录。下一步是在构建脚本、项目文件和脚本中使用特定于用户的部分,或者使用环境变量的任何内容。

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


否则,您可能会查看git子模块

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

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

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

/Project
    /Foo
    /Bar
    /Preferences
在/Project/.gitignore中,要忽略/Project/Preferences的行
/Preferences
。并在/Project/Preferences中初始化“秘密”回购。(我称之为机密,因为外部回购不知道。)如果其他软件希望其首选项文件位于主回购部分的某个特定位置,则可以在/Project/Preferences文件夹中创建指向某个内容的符号链接。是否可以跟踪符号链接;随着时间的推移,它应该基本上是稳定的,所以你不会关心它的历史,而且它的历史无论如何都是独立于主项目的,所以我可能会忽略它

您不需要/Project下面的/Preferences,但它必须位于相对于/Project的一个位置,符号链接的想法才能发挥作用,所以我会将它放在下面。只要外部存储库忽略了内部存储库,那么在另一个存储库下初始化存储库是完全正确的。我使用~folder和~folder下的项目执行此操作


尽管从逻辑上讲,您可能希望您的用户首选项链接到您在主repo中所做的某些提交,但这在git中是根本不可能的,因此您肯定必须在主repo中的提交与机密repo中的这些提交所对应的首选项之间进行手动同步。Git从根本上关心整个回购协议的状态(这意味着它所跟踪的一切),并且它永远不能提交部分提交。(因为即使只取出一个文件,提交的SHA-1哈希标识也完全不同)。

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

git update-index --assume-unchanged <file name>
git更新索引--假定未更改
对git执行此操作,如果您为
*\u mine.
添加一个全局svn忽略规则,它对svn应该可以正常工作

免责声明:默认情况下,它不支持任何版本,但允许您备份和还原与
*\u mine.*
忽略规则匹配的任何内容