Git Clone:请给我一些文件?

Dan*_*ark 129 git

我想克隆一个GIT仓库而不是最终得到一个.git目录.换句话说,我只想要文件.有没有办法做到这一点?

git clone --no-checkout与我想要的完全相反(给了我一个.git目录).

我试图为远程仓库而不是本地仓库做这个,这意味着这不是 " 如何做"git导出"(如"svn export") " 的重复 "(即使解决方案最终可能是相同).

Von*_*onC 70

git命令最接近您要查找的内容git archive.
请参阅备份使用git的项目:它将在归档中包含所有文件(如果您使用的是git-archive-all脚本,则包括子模块)

然后,您可以在任何地方使用该存档,只返回文件,不返回.git目录.

git archive --remote=<repository URL> | tar -t
Run Code Online (Sandbox Code Playgroud)

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

git archive --remote=<repository URL> | tar -t --exclude="*/*"
Run Code Online (Sandbox Code Playgroud)

仅列出远程仓库的第一级文件夹:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"
Run Code Online (Sandbox Code Playgroud)

注意:这对GitHub不起作用(不支持)

因此,您需要克隆(浅层以加快克隆步骤),然后在本地存档:

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar
Run Code Online (Sandbox Code Playgroud)

另一种选择是做一个浅层克隆(如下所述),但将.git文件夹放在别处.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo
Run Code Online (Sandbox Code Playgroud)

repo文件夹只包含文件,没有.git.

注意:git --git-dir命令git的选项,而不是git clone.


使用Git 2.14.X/2.15更新(2017年第4季度):它将确保避免添加空文件夹.

" git archive",特别是当与pathspec一起使用时,在其输出中存储一个空目录,即使Git本身从未这样做过.
这已得到修复.

RenéScharfe的承诺4318094(2017年9月12日)(``).
建议:杰夫金(peff).
(由Junio C gitsterHamano合并- -提交62b1cb7,2017年9月25日)

archive:不要将空目录添加到存档

虽然git不跟踪空目录,git archive但可以欺骗一些将其放入档案中.
虽然对象数据库支持它,但它不能在索引中表示,因此它不太可能在野外发生.

由于git不支持空目录,因此也不应将它们写入存档.
如果确实需要一个空目录,则可以通过在其中放置一个空.gitignore文件来跟踪和存档它.

  • 这对我有用.我还要补充一点.如果你根本不关心.git文件夹,那么我会使用这个命令:`git --git-dir =/dev/null clone --depth = 1/url/to/repo` (4认同)
  • 这不会删除 .git 文件夹 (2认同)
  • @AndréWerlang7年后......我不太确定`@`:我已经将它删除了.此外,GitHub不支持远程`git archive`:我编辑了答案以提出替代方案. (2认同)

小智 58

git archive --format=tar --remote=<repository URL> HEAD | tar xf -
Run Code Online (Sandbox Code Playgroud)

取自这里

  • `--format = tar`是不必要的."tar"是默认输出,无需指定. (2认同)

kni*_*ttl 40

你可以创建一个浅层克隆,只获得最后几个修订:

 git clone --depth 1 git://url
Run Code Online (Sandbox Code Playgroud)

然后只需删除.git目录或使用git archive导出树.


Sla*_*lam 6

git checkout -f git checkout -f

还有另一种方法可以通过将存储库从工作树中分离出来来实现此目的。

如果您需要定期更新这些无 git 的 git 文件,此方法非常有用。例如,当我需要签出源文件并构建工件,然后将工件复制到不同的存储库以部署到服务器时,我会使用它,当我想要将源代码推送到服务器时,我也会使用它签出源代码并将其构建到 www 目录中。

我们将创建两个文件夹,一个用于 git,另一个用于工作文件:

mkdir workingfiles
mkdir barerepo.git
Run Code Online (Sandbox Code Playgroud)

初始化一个裸 git 存储库:

cd barerepo.git
git --bare init 
Run Code Online (Sandbox Code Playgroud)

然后创建一个 post-receive 钩子:

touch hooks/post-receive
chmod ug+x hooks/post-receive
Run Code Online (Sandbox Code Playgroud)

在您最喜欢的编辑器中编辑接收后的内容:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]
Run Code Online (Sandbox Code Playgroud)

将其添加为远程:

git remote add myserver ssh://user@host:/path/to/barerepo.git
Run Code Online (Sandbox Code Playgroud)

现在,每次您推送到这个裸存储库时,它都会将工作树检出到/workingfiles/. 但/workingfiles/它本身不受版本控制;运行git status进去/workingfiles/会报错fatal: Not a git repository (or any parent up to mount point /data)。这只是普通文件。

与其他解决方案不同rm -r .git,不需要命令,因此如果/workingfiles/是其他 git 存储库,您不必担心使用的命令删除其他存储库的 git 文件。

  • 如果您只需要定期查看文件,那么工作量并不大。 (2认同)

And*_*rew 5

为什么不执行克隆然后删除.git目录,以便您只有一个裸露的工作副本?

编辑:或者实际上为什么要使用克隆?当你说你想要一个 git repo 但没有.git目录时,这有点令人困惑。如果你的意思是你只想要树的某个状态的副本,那么为什么不在cp -Rshell 中而不是在 git clone 中做,然后在.git之后删除它。

  • @mathepic:要发布 tarball,您需要一种从存储库中获取干净工作副本的方法 - 这正是提出的问题。 (3认同)
  • .git 文件夹很大。我不需要花费所有额外的磁盘使用来复制 .git。我只需要文件。我确信有办法做到这一点...... (3认同)