V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
5200
V2EX  ›  程序员

用 Git 可以控制线上代码无注释,本地代码有注释嘛?

  •  
  •   5200 · 2019-05-29 10:14:06 +08:00 · 7826 次点击
    这是一个创建于 2004 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如在本地码的代码带了很多注释,
    但是想代码同步到生产环境的时候把注释全部去除,
    为方便后续的改版,有没有什么好的解决方案呢。

    如:第一次本地写的一个文件去注释后上线,
    后续本地又修改了这个文件,
    在多人维护一起用这个库的时候,
    如何方便的只更新改过的代码而不带多余的注释呢,
    在一个 git 库内可以实现嘛,各位大佬怎么处理这种情况的。
    第 1 条附言  ·  2019-05-30 09:48:28 +08:00
    谢谢各位大佬的建议,
    本地项目有好几个,两个项目是无需编译,直接用源代码跑的,(需去注释)
    还有一个项目是编译后上线,(这个无需去注释)

    总结一下,

    方法一,
    可以创建两个创库,一个有注释版,一个无注释版,线上代码直接拉无注释版,
    每次更新功能后,将有注释去注释后更新到无注释库,这样线上拉取代码的时候,不用拉整个项目。

    方法二,
    利用 hooks 的方式,写一个 python 脚本,利用 post-receive 进行自动部署,
    然后得到拉取到的文件列表,使用正则去注释。(这部分接口还没了解,感觉理论可行)

    或者还有其他的方式,欢迎指正。

    场景很简单,
    项目代码是直接去线上跑,无需编译的,
    保证线上运行的代码是无注释版。


    避免类似,
    // 抽奖不成功也要发送弹幕,概率 20%,造成很多人中奖的假象
    // 这里是 xxx 密码
    // 这里是支付宝回调路由

    还有就是之前服务器被黑过一次,项目代码被整站下载,之前注释写的太详细。
    别人利用写的注释,很容易的伪造一些消费记录,活跃积分,轻松后台提现。
    如果去注释,这将难得多。
    后面进行一系列的维护,被黑概率以及很小了。
    46 条回复    2019-05-30 15:58:07 +08:00
    codeduan
        1
    codeduan  
       2019-05-29 10:21:40 +08:00   ❤️ 2
    这个或许不应该从 git 的角度上考虑,应该从打包工具之类上考虑吧。比如 JS 的 webpack 就可以配插件去除注释。
    sbw
        2
    sbw  
       2019-05-29 10:22:24 +08:00
    像 js css 一般都会 compress,编译型的就无所谓了吧
    sonyxperia
        3
    sonyxperia  
       2019-05-29 10:22:30 +08:00   ❤️ 2
    代码都提交了,注释有什么见不得人的
    Vegetable
        4
    Vegetable  
       2019-05-29 10:29:15 +08:00   ❤️ 2
    不想让公共仓库里存在注释吗,这个逻辑很复杂,三两句都描述不清楚,难的不是去掉,而是你从仓库 pull 没有注释的代码,怎么把你的注释加回去.
    比如你本地的注释在 A 行和 B 行之间,别人把 A 和 B 都删了,那你本地这个注释怎么处理,根据绝对位置肯定不行,相对定位的行又不见了.Git 没法定位这个吧

    也就是说去掉注释是一个不可逆的操作,变成无注释的简单,想从无注释改为有注释的版本无法实现,单纯的去掉注释的话,办法估计很多.
    isCyan
        5
    isCyan  
       2019-05-29 10:30:12 +08:00 via Android
    @Vegetable Git 会让你 手工处理吧
    lihongjie0209
        6
    lihongjie0209  
       2019-05-29 10:30:45 +08:00
    第一个是部署的问题,不是 git 的问题

    第二个可以用一台中间服务器处理, 你们所有人都提交到中间的 git 服务器, git 服务器把你的注释都删除之后再次提交到你们的最终 git 服务器
    liuxey
        7
    liuxey  
       2019-05-29 10:32:09 +08:00
    @Vegetable #4 言之有理,楼主再仔细琢磨下场景吧,既然不想别人看到注释,就别上传了吧,或者给编译后的包
    okoook
        8
    okoook  
       2019-05-29 10:32:20 +08:00 via iPhone   ❤️ 31
    // 抽奖不成功也要发送弹幕,概率 20%,造成很多人中奖的假象
    Vegetable
        9
    Vegetable  
       2019-05-29 10:33:09 +08:00
    仔细看了一下觉得你这个不是想在仓库里没有注释,而是在线上运行没有注释,那就是构建时做的事情,如果你们是直接将 git 代码部署到线上不做处理的话会出现你描述的问题.这时候应该加一步构建的的步骤,打包的时候去掉注释,而不在仓库里操作.
    vicvinc
        10
    vicvinc  
       2019-05-29 10:34:24 +08:00
    弄两个分支,一个带 comment 一个不带,开发的时候在有 comment 的分支下开发,开发完 checkout 到 none-comment 的分支,跑个 clean-comment 的脚本,commit
    vicvinc
        11
    vicvinc  
       2019-05-29 10:35:24 +08:00
    要么就是弄个 CI 脚本,提交到指定分支后自动清除注释
    whypool
        12
    whypool  
       2019-05-29 10:38:03 +08:00
    git:滚犊子
    Sapp
        13
    Sapp  
       2019-05-29 10:41:42 +08:00
    你这个需求真的很奇葩,而且不应该是 git 去做,你可以单独配置一下 webpack,只去掉注释,打包进另一个本地文件夹,然后 git 上传这个文件夹,最后把命令串起来,就是你要的效果了
    Sapp
        14
    Sapp  
       2019-05-29 10:43:09 +08:00
    而且如果你是线上没有注释的话,直接在打包发布的时候去掉注释不就行了吗?这关 git 仓库什么事?为什么要想着去掉仓库的注释
    5200
        15
    5200  
    OP
       2019-05-29 11:07:25 +08:00
    估计只能本地编写完成,然后跑一个脚本去注释,然后再整站部署到线上了。

    之前是考虑如果在一个 git 仓库里面,弄个分支,
    子分支有注释,主分支无注释,
    所有协同操作都在子分组进行,
    当到更新功能的时候,
    看子分支更新了哪些文件,然后把这些文件去注释,
    替换主分支内容, 线上代码直接 git pull 一下主分支。
    不过这样感觉替换和找这几个文件就比较麻烦了

    项目大小比较大,逻辑代码部分感觉有 500MB++
    如果每次更新小模块功能也整站去注释后部署,感觉得不偿失了。

    弄两个仓库的话,A 仓库有注释,B 仓库是无注释的线上代码,
    更新一个功能后,从 A 仓库整站去注释后,再将项目替换到 B 仓库。
    git 就好像有个问题,同一个文件,如果去注释后代码相同,也会冒红。
    不知道 git 是不是通过 md5 校验的,里面修改时间什么的也加进去校验了。
    这样就相当于线上代码更新的时候要去下载这个 500MB++ 的代码,而不是只下载那几 KB 更新的文件了。
    iiusky
        16
    iiusky  
       2019-05-29 11:10:23 +08:00
    你想法很危险啊,要是这样的话,公司项目后期都找不到人维护了。只有你本地有注释,去掉注释应该是在从 git 部署到生产环境的那个步骤走的。而不是上传到 git 的就是没有注释的
    zhengxiaowai
        17
    zhengxiaowai  
       2019-05-29 11:10:45 +08:00
    如果是后端的话,上线带不带注释问题不大把?
    前端 webpack 有插件可以去除注释自动 ugly 代码。
    后端的话目前好像还没有什么现成的工具,可以通过解析 ast 删除注释后生成代码实现
    huamiao
        18
    huamiao  
       2019-05-29 11:11:47 +08:00
    我感觉 LZ 需要先解释一下他的上线流程。
    loading
        19
    loading  
       2019-05-29 11:12:30 +08:00
    建议别在 git 提交前做这个工作,你应该是自动部署时拉代码后用工具自动清理。
    ReVanTis
        20
    ReVanTis  
       2019-05-29 11:14:49 +08:00 via Android
    自己加 hook 呗,有啥干不了的
    5200
        21
    5200  
    OP
       2019-05-29 11:16:43 +08:00
    @iiusky 有子分支是有注释,只是线上代码去注释, 部署是通过 Jenkins 拉主分支。
    @zhengxiaowai 是后端,emm 他们就是想想上线的代码不带注释。。
    @loading 单独处理一次是没问题,之后后续更新功能后,不想整站都拉一边,后端有什么好的工具嘛?
    dobelee
        22
    dobelee  
       2019-05-29 12:33:19 +08:00 via Android
    加个 post-receive 钩子不就搞定了?
    love
        23
    love  
       2019-05-29 13:24:21 +08:00
    用 hook, push 上去的时候把注释原地加密,pull 的时候解密
    brust
        24
    brust  
       2019-05-29 14:47:02 +08:00
    @okoook 8
    很有道理
    Raymon111111
        25
    Raymon111111  
       2019-05-29 15:10:58 +08:00
    1 楼说的对

    再想想 git 是干嘛用的
    no1xsyzy
        26
    no1xsyzy  
       2019-05-29 15:27:04 +08:00
    每次更新代码后先 reset 再 pull,再运行一次清除注释。
    BreezeInWind
        27
    BreezeInWind  
       2019-05-29 15:30:40 +08:00 via Android
    @okoook 哈哈哈让我想起了穷逼 VIP
    no1xsyzy
        28
    no1xsyzy  
       2019-05-29 15:33:21 +08:00
    但是讲道理有点爆笑了,因为你想用(不一定完整的) git 历史
    > 这样就相当于线上代码更新的时候要去下载这个 500MB++ 的代码,而不是只下载那几 KB 更新的文件了。
    你又想没注释,真当 .git 目录空的?

    除非
    1. 攻击者可能(通过漏洞等方式)获得读取后端代码权限
    2. 攻击者不可能(通过漏洞等方式)获得读取 .git 目录权限
    这怎么想都不可能。

    还有一种就是加密注释,信息并没有被除去而只是被隐藏。
    比如 AST 分析后把注释过一遍 AES 加密。
    5200
        29
    5200  
    OP
       2019-05-29 15:51:29 +08:00
    @no1xsyzy 别人应该不能通过.git 目录在没有私有库秘钥的情况切换到其他的分支吧。。。
    no1xsyzy
        30
    no1xsyzy  
       2019-05-29 15:57:49 +08:00
    @5200 只要拉了就随便切,密钥是用来保护传输过程的,而不是本地的副本。
    Android2MCU
        31
    Android2MCU  
       2019-05-29 16:16:56 +08:00 via iPhone
    加密注释啊,自己保留密钥就行了啊,这样推出去别人就看不了了,写个加解密工具分分钟的事情
    az999
        32
    az999  
       2019-05-29 17:35:07 +08:00
    编译后 再反编译回来提交 就没有注释了
    nacosboy
        33
    nacosboy  
       2019-05-29 19:12:49 +08:00 via Android
    CI 做的事,AST 解析然后去注释
    Cbdy
        34
    Cbdy  
       2019-05-29 19:17:38 +08:00 via Android
    线上代码加预处理
    linchengzzz
        35
    linchengzzz  
       2019-05-29 19:36:00 +08:00
    突然有一天电脑坏掉了,换了台新电脑拉取代码,发现注释都没了,完了看不懂了 TAT
    shehuizhuyi
        36
    shehuizhuyi  
       2019-05-29 19:47:54 +08:00
    那不如直接加密代码?
    5200
        37
    5200  
    OP
       2019-05-29 19:56:04 +08:00
    @linchengzzz 代码库在码云。。。
    dalabenba
        38
    dalabenba  
       2019-05-29 20:01:14 +08:00 via Android
    应该可以用 git hook 的 push 阶段脚本删一下(没操作过,感觉应该可以)
    ETiV
        39
    ETiV  
       2019-05-29 20:02:46 +08:00 via iPhone
    两个 repo:一个是有注释的,一个是没注释的

    开发用有注释的,用类似 GitHub Web Hook 的机制,把源代码 strip 成没注释的同步进另外的 repo。

    线上用这个没注释的。
    cpdyj0
        40
    cpdyj0  
       2019-05-29 20:07:33 +08:00
    去掉注释,拉取代码时怎么办?
    HeiXiaoBai
        41
    HeiXiaoBai  
       2019-05-29 20:52:58 +08:00
    似乎你们是通过 git 上传代码到生产服务器直接用的?前端?
    可以考虑一下先上传到指定目录,然后脚本去注释做处理再移动过去
    或者将干脆 git 单独一个服务器出来 ……
    elicec
        42
    elicec  
       2019-05-29 21:24:46 +08:00
    git add -p source.java ??
    MonoLogueChi
        43
    MonoLogueChi  
       2019-05-29 22:40:21 +08:00 via Android
    这样其他然怎么同步你的分支呢,而且合并起来也是困难重重
    janus77
        44
    janus77  
       2019-05-29 22:42:15 +08:00 via iPhone
    git 本身只是一个文件管理系统,其核心是文件本身……他没有附带对注释的区分,所有的内容都是文件本身的一部分
    wizardoz
        45
    wizardoz  
       2019-05-30 09:30:21 +08:00
    去掉注释的好处?
    no1xsyzy
        46
    no1xsyzy  
       2019-05-30 15:58:07 +08:00
    @janus77 准确地说是行管理系统,它对于行有区分。
    但没有对行的跨文件移动……虽然除了重编排模块分隔外没什么用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.