git 无法一次性 add / commit 大量文件? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
lua
V2EX    git

git 无法一次性 add / commit 大量文件?

  •  
  •   lua 2016-04-24 08:58:04 +08:00 17301 次点击
    这是一个创建于 3459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    OS X 系统,使用 git 一次性导入大量文件,文件列表参数由程序自动生成, n 大于 4096 :

    git add -- <file1> <file2> ... <filen> 

    运行命令出现错误:

    too many arguments (6861) -- limit is 4096

    git 高手们有遇到这种情况吗,该怎么解决?

    54 条回复    2016-04-25 17:25:17 +08:00
    Neytoph
        1
    Neytoph  
       2016-04-24 09:00:34 +08:00 via iPhone   1
    “ git add .”你要的应该是这个....
    lua
        2
    lua  
    OP
       2016-04-24 09:07:15 +08:00
    @Neytoph "git add ." 是添加全部,但现在需要 add / commit 任意指定的文件
    SelFree
        3
    SelFree  
       2016-04-24 09:08:15 +08:00   1
    =。= 6000+文件,看提示 limit is 4096 。这么多文件肯定不是手工整理的啦。分成多次或者导成 shell 呗:
    git add <file1>
    git add <file2>
    ...
    ChiangDi
        4
    ChiangDi  
       2016-04-24 09:13:56 +08:00 via Android
    分两次 add 呗
    SelFree
        5
    SelFree  
       2016-04-24 09:16:00 +08:00
    还有这个 4096 应该是 shell 的限制
    lua
        6
    lua  
    OP
       2016-04-24 09:16:07 +08:00
    @SelFree 分批 add 确实没问题, commit 该如何解决,也是需要指定任意文件
    SelFree
        7
    SelFree  
       2016-04-24 09:17:50 +08:00
    @SelFree 一次 commit 就是你当前 add 的内容
    git add file1
    git add file2
    git add filen
    git commit
    这个时候就是 commit file1 、 file2 ... filen 啊
    SelFree
        8
    SelFree  
       2016-04-24 09:18:19 +08:00
    @lua 看上一条
    YuJianrong
        9
    YuJianrong  
       2016-04-24 09:19:49 +08:00 via iPhone
    commit 不会有问题吧,不需要解决。
    lua
        10
    lua  
    OP
       2016-04-24 09:20:10 +08:00
    @SelFree 有些文件暂时还不想一起提交
    SelFree
        11
    SelFree  
       2016-04-24 09:20:41 +08:00
    @lua
    不想提交的就不要 add 啊。。。
    neoblackcap
        12
    neoblackcap  
       2016-04-24 09:20:49 +08:00
    若是生成文件都在一个文件夹里面的话,你 add 那个文件夹就好了
    sagnitude
        13
    sagnitude  
       2016-04-24 09:22:21 +08:00
    你既然知道哪些文件不想提交,剪切出来不就行了
    loggerhead
        14
    loggerhead  
       2016-04-24 09:25:06 +08:00 via iPhone   1
    这跟 git 无关,是 shell 的限制,可以了解一下 xargs
    lua
        15
    lua  
    OP
       2016-04-24 09:30:50 +08:00
    @SelFree 使用场景是在 GUI 中,希望能够精确指定所有文件

    @loggerhead 不知道有没有办法修改或者绕过这个限制
    Bardon
        16
    Bardon  
       2016-04-24 09:33:39 +08:00   1
    不知道你不想提交的文件规律性怎么样,有个暴力的办法,列出你不想 commit 的文件, echo 进.gitignore 里
    等 commit 后,再从.gitignore 里删除掉
    SelFree
        17
    SelFree  
       2016-04-24 09:35:55 +08:00
    @lua 怎么又到 GUI 里了。不如你描述一下你想做什么事情,这样大家可以对症下药。
    semut
        18
    semut  
       2016-04-24 09:41:08 +08:00
    @SelFree 实现是 shell ,场景是 GUI ,怎么感觉是做一个 git 的 gui 客户端啊
    bikong0411
        19
    bikong0411  
       2016-04-24 09:43:28 +08:00
    这是 shell 报的错,跟 git 无关
    lizheming
        20
    lizheming  
       2016-04-24 09:47:37 +08:00
    如果是添加的多,不想添加的只有几个,可以 git add . 之后然后 git reset file 。当然我更推荐的是使用 git add -i 进入交互模式,可以自行选择需要 add 的文件,非常方便。
    owlsec
        21
    owlsec  
       2016-04-24 10:08:45 +08:00   1
    .gitignore
    xiamx
        22
    xiamx  
       2016-04-24 10:19:15 +08:00
    echo "<file1> <file2> <filen>" | xargs git add --
    327beckham
        23
    327beckham  
       2016-04-24 10:49:28 +08:00
    你既然能整理出<file1> <file2> <file3> 。。。。这么长的列表,那就再弄一个 bash 脚本,内容是:
    git add <file1>
    git add <file2>
    git add <file3>
    ......
    lua
        24
    lua  
    OP
       2016-04-24 11:00:12 +08:00
    @Bardon @owlsec .gitignore 值得一试,简单粗暴直截了当
    mengzhuo
        25
    mengzhuo  
       2016-04-24 11:18:29 +08:00
    shell 的问题怎么能怪 git 呢
    楼主的结构有问题了吧
    sunjourney
        26
    sunjourney  
       2016-04-24 11:22:49 +08:00 via iPhone
    这么多文件真的是项目文件吗?什么东西的源码会这样?编译后的东西不要同步了好吧?
    Clarencep
        27
    Clarencep  
       2016-04-24 11:25:26 +08:00
    如果不想提交的文件比较少,可以先 `git add .` 然后使用 `git reset HEAD 不想提交的文件` 来排除
    Ixizi
        28
    Ixizi  
    nbsp;  2016-04-24 11:32:09 +08:00
    把要改的随便加点注释之类的,然后 git add -u
    Kirscheis
        29
    Kirscheis  
       2016-04-24 11:33:03 +08:00 via Android
    这是 shell 的问题,和 git 没关系。 echo " " | xargs git add -- 就好了
    wizardoz
        30
    wizardoz  
       2016-04-24 12:00:27 +08:00
    同觉得问题不存在,不想 commit 的文件不要 add 就行了,又要 add 又不想 commit 的理由是什么?
    skydiver
        31
    skydiver  
       2016-04-24 12:45:56 +08:00 via iPad
    @mengzhuo 楼主的结构有问题, 23333
    itfanr
        32
    itfanr  
       2016-04-24 13:16:33 +08:00
    git add -A
    kxxoling
        33
    kxxoling  
       2016-04-24 13:32:21 +08:00
    git add . ;git rm xxx --cached?
    kxxoling
        34
    kxxoling  
       2016-04-24 13:33:22 +08:00
    没提交的话 git add .; git reset xxx 应该也行。话说这么多文件就不能用通配符?
    xwartz
        35
    xwartz  
       2016-04-24 13:35:16 +08:00
    git add --all
    marcushbs
        36
    marcushbs  
       2016-04-24 14:23:14 +08:00
    function gc {
    for f in `git status |grep modified|awk '{print $3}'`
    do
    git add $f
    done
    git commit -m "$1"
    git push
    }
    billlee
        37
    billlee  
       2016-04-24 15:02:11 +08:00
    你需要 xargs
    hzlzh
        38
    hzlzh  
    PRO
       2016-04-24 15:39:38 +08:00
    之前做 temp.im 这个服务的时候尝试过 push 100w 个文件到 github 上,是分批进行的, github 有做限制。
    via t/57477
    后来换七牛 CDN 来存了
    BOYPT
        39
    BOYPT  
       2016-04-24 15:58:41 +08:00
    命令行长度是内核限制来的。跟 git 无关
    bicoff9527
        40
    bicoff9527  
       2016-04-24 17:21:47 +08:00
    奇怪的想法,大概是对 git 不熟
    Haku
        41
    Haku  
       2016-04-24 17:33:56 +08:00
    too many arguments 是指参数太多,也就是命令用错的意思....
    tsl0922
        42
    tsl0922  
       2016-04-24 17:41:52 +08:00
    如果想忽略当前 index 内容只提交特定文件可以使用: git commit --only -m <msg> -- <file>...
    strwei
        43
    strwei  
       2016-04-24 17:45:22 +08:00
    git add -A
    mhtt
        44
    mhtt  
       2016-04-24 20:48:13 +08:00 via iPhone
    git add -A ?
    cheerzeng
        45
    cheerzeng  
       2016-04-24 21:14:45 +08:00
    如果是同类文件,以 python 文件为例,可以 git add *.py
    至于 commit ,跟 add 几次没关系啊
    pynix
        46
    pynix  
       2016-04-24 21:31:42 +08:00
    分成 2 批。。。
    wensonsmith
        47
    wensonsmith  
       2016-04-24 22:07:18 +08:00
    git add -A
    starcraft
        48
    starcraft  
       2016-04-24 22:31:04 +08:00 via iPhone
    今天也碰到了添加的问题 刚好搜了研究下-A 的命令
    kirisetsz
        49
    kirisetsz  
       2016-04-24 23:31:33 +08:00
    这个是 shell 或者系统调用的限制解法嘛,把结果导入 xargs 转换一下吧 find . -print0 -type f | xargs -n1 git add -- 这样。
    busyluo
        50
    busyluo  
       2016-04-25 06:43:18 +08:00 via iPhone
    用 gitgit stage 添加要提交的文件

    http://m.blog.csdn.net/article/details?id=50357277
    chuxiwen
        51
    chuxiwen  
       2016-04-25 08:37:12 +08:00 via iPad
    too many arguments (6861) -- limit is 4096

    这个是 shell 的限制,可以自写个 shell script 克服这个问题

    http://stackoverflow.com/questions/13781216/bash-meaning-of-too-many-arguments-error-from-if-square-brackets
    allenforrest
        52
    allenforrest  
       2016-04-25 09:28:09 +08:00
    感觉是做文件云同步,底层机制用 git 实现
    darasion
        53
    darasion  
       2016-04-25 10:25:56 +08:00
    是 shell 的限制。即便你不用 git ,删除这么多文件也是有问题的。

    一般命令行参数太多了或者不能预期是多少的时候,都得用 xargs 命令展开一下。
    SmiteChow
        54
    SmiteChow  
       2016-04-25 17:25:17 +08:00
    顶楼上,楼上说的展开就是走管道,妥妥的没问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3447 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:49 PVG 12:49 LAX 21:49 JFK 00:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86