代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

吉特·克隆:就这些文件,拜托?

git
  •  116
  • Dan Rosenstark  · 技术社区  · 14 年前

    我想克隆一个GIT repo,而不是以 .git

    git clone --no-checkout 和我想要的完全相反 .吉特 目录)。

    我想这样做是为了 回购,不是本地回购,意思是 “的” How to do a “git export” (like “svn export”) “(即使最终的解决方案可能是相同的)。

    6 回复  |  直到 7 年前
        1
  •  74
  •   VonC    6 年前

    git命令与您要查找的最接近 git archive
    backing up project which uses git :它将包含在存档中的所有文件(如果使用 git-archive-all 脚本)

    你可以在任何地方使用这个档案,只给你回文件,不 .git 目录。

    git archive --remote=<repository URL> | tar -t
    

    如果您只需要第一级的文件夹和文件:

    git archive --remote=<repository URL> | tar -t --exclude="*/*"
    

    git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"
    

    注意:那 does not work for GitHub (not supported)

    所以你需要 to clone (shallow to quicken the clone step), and then archive locally

    git clone --depth=1 git@github.com:xxx/yyy.git
    cd yyy
    git archive --format=tar aTag -o aTag.tar
    

    另一个选择是进行浅层克隆(如下所述),但将.git文件夹定位在其他位置。

    git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo
    

    repo文件夹将只包含文件,而不包含 .吉特

    注: git --git-dir command git git clone .


    更新Git 2.14.X/2.15(2017年第4季度):它将 .

    git存档 “,特别是与pathspec一起使用时,存储的是空的 即使Git本身从来没有这样做过,它的输出中也有目录。
    这个问题已经解决了。

    commit 4318094 René Scharfe (``) .
    Jeff King ( peff ) .
    Junio C Hamano -- gitster -- 在里面 commit 62b1cb7 2017年9月25日)

    archive

    虽然git不跟踪空目录, git存档 可能会被骗去存档。
    虽然对象数据库支持这一点,但它不能在索引中表示,因此不太可能在野外出现。

    写进档案。
    如果真的需要一个空目录,那么可以通过放置一个空的 .gitignore 在里面归档。

        2
  •  59
  •   Community Egal    7 年前
    git archive --format=tar --remote=<repository URL> HEAD | tar xf -
    

    取自 here

        3
  •  42
  •   knittl    14 年前

    您可以创建一个浅克隆以仅获取最后几个修订:

     git clone --depth 1 git://url
    

    然后简单地删除.git目录或使用 git archive 导出你的树。

        4
  •  3
  •   Andrew    14 年前

    为什么不执行克隆,然后删除 .git 所以你只有一份工作目录?

    编辑:或者事实上为什么要使用克隆?当你说你想要一个git回购但没有 目录。如果你的意思是你只想要一个树的某个状态的副本,那为什么不 cp -R .吉特 之后。

        5
  •  2
  •   JaredPar    14 年前

    听起来你只是想要一份源代码的副本。如果是这样,为什么不复制目录并从副本中排除.git目录呢?

        6
  •  2
  •   Slam    5 年前

    另一种方法是将回购协议从工作树中分离出来。

    如果需要定期更新这些无git的git文件,此方法非常有用。例如,当我需要签出源文件并构建工件时,我使用它,然后将工件复制到另一个repo中以便部署到服务器,当我希望源代码签出并构建到www目录时,我也在将源代码推送到服务器时使用它。

    mkdir workingfiles
    mkdir barerepo.git
    

    初始化裸git回购:

    cd barerepo.git
    git --bare init 
    

    touch hooks/post-receive
    chmod ug+x hooks/post-receive
    

    在您喜爱的编辑器中编辑post receive:

    GIT_WORK_TREE=/path/to/workingfiles git checkout -f
    # optional stuff:
    cd down/to/some/directory
    [do some stuff]
    

    将此添加为远程:

    git remote add myserver ssh://user@host:/path/to/barerepo.git
    

    现在,每次你推到这个光秃秃的回购协议,它都会将工作树签出给 /workingfiles/ . 但是 本身不受版本控制;正在运行 git status 在里面 将给出错误 fatal: Not a git repository (or any parent up to mount point /data)

    与其他解决方案不同 rm -r .git /工作文件/

        7
  •  -2
  •   edam    5 年前

    非常简单的IMHO:

    1. git clone REPO_URL 那么
    2. 只需移除 .git 目录使用 rm -rf ./REPO_NAME/.git

    例如,如果我的存储库的名称是 MyRepo

    git clone https://github.com/MyUser/MyRepo.git && rm -rf ./MyRepo/.git
    

    或者我可以把它放到一个指定的目录中(比如在一个名为 MyDir ):

    git clone https://github.com/MyUser/MyRepo.git MyDir && rm -rf ./MyDir/.git
    

    希望这能有所帮助。