我对一个我不想提交到我的存储库的文件进行了本地更改.它是用于在服务器上构建应用程序的配置文件,但我想在本地使用不同的设置进行构建.当然,当我将'git status'作为要上演的东西时,该文件总是显示出来.我想隐藏这个特定的更改而不是提交它.我不会对文件进行任何其他更改.
经过一番挖掘后,我看到了两个选项:'假设未改变'和'跳过工作树'.这里的前一个问题谈到了它们,但并没有真正解释它们之间的区别.我的问题是:这两个命令有何不同?为什么有人会使用其中一个?
我团队中的每个开发人员都有自己的本地配置.该配置信息存储在一个文件中,该文件devtargets.rb在我们的rake构建任务中使用.不过,我不希望开发人员破坏对方的devtargets文件.
我的第一个想法是将该文件放在.gitignore列表中,以便它不会被提交给git.
然后我开始想知道:是否可以提交文件,但忽略对文件的更改?所以,我会提交一个默认版本的文件,然后当开发人员在本地机器上更改它时,git会忽略这些更改,当你执行git status或git commit时它不会显示在已更改文件列表中.
那可能吗?这肯定是一个很好的功能......
我创建了一个包含在git存储库中的文件的默认版本.重要的是,当某人克隆存储库时,他们会获得此文件的副本.但是,我想设置git,以便稍后忽略对此文件的更改. .gitignore仅适用于未跟踪的文件.
我的动机是这个文件包含机器特定的信息.我想提供默认值,同时允许人们进行不会被推回原始存储库的本地更改,从而在我们提取新更改时创建合并冲突.
我们通常非常懒惰并且使用git add .很多,所以我很确定如果我不能告诉git忽略这个文件,对它的更改将最终得到提交和推送.
总结一下,
default_values.txt添加到我的git存储库,并在有人克隆该存储库时包含该文件.git add .不应该添加default_values.txt到提交.具体来说,我维护了我的dotfiles的git存储库.我最近开始研究一台新机器,并在同一台机器上克隆了我的存储库.
现在,我希望对我的dotfiles进行一些更改,这些更改仅适用于此系统.我希望在我的存储库中忽略这些更改.
我应该继续跟踪和提交其他更改.
例如,在我的.gitconfig中,我有一个设置为:
[push]
default = simple
Run Code Online (Sandbox Code Playgroud)
现在,在我的新机器上,git的版本使用得很旧.它仍然不支持simplepush 的设置.所以,我想改变这一点,但仅限于本地.
但是,如果我对.gitconfig进行任何其他更改,我想跟踪这些.无论如何我能做到这一点?
编辑:
我知道git update-index --assume-unchanged.它的问题是git将不再跟踪我的文件,直到我反转它.然后,它将跟踪所有变化.
我希望忽略某些变化并跟踪其余变化.
我有一个数据库配置文件,其默认值不重要.但是,对此文件的任何更改都将包含不应在repo中跟踪的敏感信息.
我希望Git存储库的未来可以包含默认版本,但忽略任何用户所做的任何更改.
以下内容保留了本地配置,但将删除推送到repo导致将来拉出的问题.
cat "app/dir/config.file" >> .gitignore
git rm --cached app/dir/config.file
Run Code Online (Sandbox Code Playgroud)
以下是这项工作,但不会持续超过对回购的推动.
git update-index --assume-unchanged app/dir/config.file
Run Code Online (Sandbox Code Playgroud)
这似乎是围绕敏感信息进行版本控制的常见要求,但我似乎无法找到解决方案.
我克隆了一个存储库,我的仓库中的master分支正在跟踪origin/master.我创建了一个work分支并更改了一些特定于我的开发机器的配置文件,以使应用程序正常工作.
我的正常工作流程是切换到master分支,合并work分支中push的更改以及上游的更改.问题是我不希望我的特定chnages被推.当我合并我的work分支时,master这些更改也会合并.
到目前为止,我发现的唯一解决方案是不进行这些更改,work但这不是一个令人满意的解决方案.
我正在页面顶部写一个带有一些简单变量的简短脚本.我想和朋友一起工作,但我们不确定如何管理每次为我们中的一个人拉动后需要更改的变量,为git状态添加不必要的垃圾.我想过为我们每个人创建不同的命名分支,然后主人将只设置示例用户名,但是必须完成所有额外的工作合并似乎很愚蠢.我们可以将变量作为选项传递给脚本,但这不是所希望的,也不是将它分离到另一个单独的配置文件中.拥有像.gitignore这样的东西会很棒,但是只能忽略文件中的几行.
如何优雅地管理这个?这个问题通常如何管理?
我们在不同的办公室有多个开发团队,他们需要在我们的项目web.config和app.config文件中进行大量配置设置的不同值.
我们希望使用一组合理的默认值来检查这些配置文件,这样通过检查trunk/master分支,您可以正常工作而无需挖掘配置文件.
从历史上看,我们已经使用了Subversion,特别是TortoiseSVN,这提供了一种管理本地更改的简便方法:我们只是将这些文件添加到TortoiseSVN的自动更改ignore-on-commit列表中.这可以防止意外签入这些文件,因为您需要专门选择它们以将其包含在签入中(并且您可以确保检查重大更改,而不是本地配置噪声).这种方法的主要缺点是配置文件总是看起来"已更改",因此无法一目了然地知道您是否有任何本地更改.
我们正在寻求转向Git,我正在努力找出最好的方法.
首先,其他StackOverflow答案中已有的内容:
选项1:检入xxx.sample文件和.gitignore实际配置文件:建议这样做,例如,在此答案中.我看到的主要问题是,在两个不同的点上很容易忘记对配置文件的更改:提交者很容易错过他们需要添加到.sample文件中的更改,而消费者(尤其是持续集成服务器)很容易错过他们需要将.sample文件中的更改合并到本地配置文件中.所以基本上,这似乎不是一个很好的解决方案.
选项2:拥有一个已签入的xxx.defaults文件和一个.gitignored xxx.local配置文件,该文件会覆盖它定义的任何设置:例如,这里提供了这个.问题是我们正在使用标准的.Net配置提供程序 - 当Mirosoft已经完成所有工作时,我真的不希望我们实现一个全新的设置加载框架.有没有人知道一种方法来获取app.config和web.config文件来引用可选的本地覆盖文件?
选项3:让开发人员保留本地分支机构,然后让他们总是检查樱桃选择或重新分支到主服务器,以便始终绕过/避免其本地分支中的不需要的提交:这是作为一个可能的工作流程在这里提供,而我在变更跟踪(所有签入的内容)方面欣赏它的清洁度,它在每次签入时都会引入大量所需的开销; 这是一个很大的痛苦!
方案4:有配置文件签入,但他们打上--assume-unchanged:这是献作为一个可能的选项,在这里 ; 据我所知,它与ignore-on-commitTortoiseSVN中的更改列表在精神上非常相似,除非您在提交过程中无法看到这些"隐藏"已更改的文件; 例如,TortoiseGit会显示带有"已更改"图标覆盖的文件,但在提交对话框中,文件根本不会显示.这看起来有点可怕,再次很容易忘记检查更改.
鉴于这些选项,我发现的所有选项,我真的希望有一种方法可以选择"包含"本地配置文件到/登录的app.config/web.config文件中,然后选择2 ; 有没有人知道这样做的方法,或者我缺少的其他选择?(我很想去考虑一个自定义的Xml合并预构建步骤......)
我之前应该提到,我们仍然在VS2008上,所以配置转换不可用.
更新:(删除,是完全错误的)
更新2:我删除了我以前的更新和答案,它是愚蠢的/不起作用.我没有意识到在"我们的"合并之后,另一个方向的下一次合并会带回这些文件的"原始"版本(覆盖本地分支的变化); 如果您有兴趣,请参阅编辑历史记录.这个问题和以往一样开放.
假设我们有一个包含敏感密码的配置文件.我想版本控制整个项目,包括配置文件,但我不想共享我的密码.
这可能是好的,如果这个配置文件:
database_password=secret
foo=bar
Run Code Online (Sandbox Code Playgroud)
变
database_password=*
foo=bar
Run Code Online (Sandbox Code Playgroud)
而且vcs的其他用户也可以自己设置密码.忽略文件不是一个好方法,开发人员应该知道,如果配置文件发生了变化.
本地版本:
database_password=own_secret
foo=bar
Run Code Online (Sandbox Code Playgroud)
vcs中的配置文件:
database_password=*
foo=bar
Run Code Online (Sandbox Code Playgroud)
然后突然,配置文件发生了变化:
database_password=*
foo=bar
baz=foo
Run Code Online (Sandbox Code Playgroud)
每个开发人员都会使用本地版本:
database_password=own_secret
foo=bar
baz=foo
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案.我怎么能实现这种行为?你如何存储你的配置文件?有没有办法做到这一点,还是我应该破解什么?
对于我的远程存储库,我试图忽略我的Umbraco网站的web.config文件..gitignore位于我的网站的根目录中,要忽略的文件,web.config也在我的网站的根目录中.
所以我将这一行添加到我的.gitignore文件中:
web.config
Run Code Online (Sandbox Code Playgroud)
但每次我将更改推送到远程存储库时,web.config文件也会被推送到远程存储库.
我究竟做错了什么?
git ×9
gitignore ×2
.net ×1
app-config ×1
git-index ×1
git-push ×1
svn ×1
umbraco ×1
web-config ×1