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 · 16871 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       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  
       2016-04-24 15:39:38 +08:00
    之前做 temp.im 这个服务的时候尝试过 push 100w 个文件到 github 上,是分批进行的, github 有做限制。
    via https://www.v2ex.com/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   ·   实用小工具   ·   5730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.