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

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

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

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

    总结一下,

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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