jjzjj

git - git涂抹/清除分支之间的过滤器

coder 2023-06-24 原文

有许多相关的问题涉及污点/清洁过滤器-我花了几个小时阅读它们,尝试各种选择,但仍然失败。我希望我能以某种方式问,我得到一个对我有用的答案。
具体来说,我已经阅读了该页,其中大部分答案链接回:
Customizing Git - Git Attributes
DR
这是一个详细的问题,但总结如下:
我可以将DEBUG = false存储在一个分支的文件中,并使用smudge/clean filters来管理该文件,将DEBUG = true存储在另一个分支中吗?怎么办?
背景
我在BitBucket托管了各种远程回购。我正在使用Win8上的sourcetree将远程repos克隆到我的笔记本电脑上。我为开发、特性、发布等创建了不同的分支(遵循A successful Git branching model的更好或更糟)。
我有一个名为Dbug.java的Android Java类,它包含一个布尔值,它在我的代码中打开/关闭各种调试日志记录、嘲弄等功能。

public static final boolean DEBUG = false;

我希望这个值在我的“生产”(主)分支上是false,在我的功能分支上是true
是否可以使用过滤器,或者我是否已经误解了用例?
我不确定过滤器是否在同一本地托管回购的两个分支之间工作,或者过滤器是否仅在两个回购之间工作。
创建过滤器
我在当地工作,检查了生产部门。我创建了一个名为debug_flag.txt的测试文件,其中包含以下内容:
// false on production branch
// true on other branches
DEBUG = false;

我在本地repo的根目录中创建了一个名为.gitattributes的文件,并向其添加了筛选器引用:
debug_flag.txt filter=debug_on_off

我用过滤器定义更新了.git/config文件:
[filter "debug_on_off"]
    clean = sed -e 's/DEBUG = true/DEBUG = false/'
    smudge = sed -s 's/DEBUG = false/DEBUG = true/'

据我所知,这应确保我的文件始终具有
生产中的假值,但当我从
生产。
这是正确的理解吗?
测试过滤器
我创建了一个新的分支,使用:
git checkout -b test

我检查了文件的内容:
$ cat debug_flag.txt

// false on production branch
// true on other branches
DEBUG = false;

我期望在文件中看到值test
当我签出文件时,“污点”过滤器不应该运行吗?
我在文件中添加了一行,并提交了。然后我又转到生产部门,这就是事情变得奇怪的地方。
如果我查看sourcetree中的文件,那么这个分支自创建以来就没有任何更改。这正是我所期望的,因为唯一的改变是在另一个分支上做出的。
如果我查看终端中的文件或记事本++,我会看到我的值已更改:
$ cat debug_flag.txt

// false on production branch
// true on other branches
DEBUG = true;

我还没有跨测试分支合并更改,也没有在生产分支上提交,但是文件已经更改。
看起来像是在这个分支中的文件上运行了污点过滤器,但不是跨分支运行的。
我错过了一个重要的拼图块,希望这是一个简单的东西,可以被有经验的人发现这样做。
我敢打赌,这是对这个概念的一个简单的误解。
请提示任何丢失的信息…
根据VONC回复更新
基本过滤器的设置工作得很好。将true文件中的筛选器定义为:
[filter "debug_on_off"]
    clean = sed -e 's/DEBUG = true/DEBUG = false/'
    smudge = sed -s 's/DEBUG = false/DEBUG = true/'

创建一个新的分支将修复false->true,合并回更改true->false。
将更改仅限于生产(主)分支需要知道从中运行分支的自定义脚本。因此,config文件变成:
[filter "debug_on_off"]
    clean = ./scripts/master_clean.sh
    smudge = ./scripts/master_smudge.sh

主\u clean.sh:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
    sed -e s/DEBUG = true/DEBUG = false/ $1
else
    cat $1
fi

硕士学位:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
    sed -e s/DEBUG = false/DEBUG = true/ $1
else
    cat $1
fi

此时,我遇到了sourcetree看到的内容与notepad++中显示的调试文件内容之间的不一致。sourcetree正在显示更改,但notepad++没有。
我接受,因为它回答了我提出的基本问题。
但是,我很可能正在实现VonC's answer,因为它以一种更简单的方式(对我来说)解决了我正在尝试解决的底层问题:在单独的分支上保留不同的配置文件。

最佳答案

我希望在文件中看到值true
您刚刚创建了一个新分支,没有签出它的内容(因为它的内容与您所在的分支相同)
要强制运行污点,请在回购顶部执行以下操作:

git checkout HEAD --

我还没有跨测试分支合并更改,也没有在生产分支上提交,但是文件已经更改。
这就是内容过滤器驱动程序的想法:它修改内容,而不影响git status(它仍然将修改后的文件报告为“unchanged”)。
为了让每个分支的污点行为不同,我建议调用一个脚本,该脚本从查找当前分支的名称开始。
请参阅我以前的答案“Best practice - Git + Build automation - Keeping configs separate”中的示例。
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)

关于git - git涂抹/清除分支之间的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22909620/

有关git - git涂抹/清除分支之间的过滤器的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  3. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  4. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  7. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  8. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

随机推荐