Git Clone:只是文件,好吗?


141

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

git clone --no-checkout与我想要的东西完全相反(只给我.git目录)。

我正在尝试针对远程回购而不是本地回购,这不是如何进行“ git导出”(如“ svn导出”)的重复(即使解决方案最终可能是相同)。



@Greg Hewgill我正在尝试从远程仓库执行此操作。不确定是否使这个问题唯一。
Dan Rosenstark 2010年

1
虽然这是一个新的问题,但我认为这是值得检查出:stackoverflow.com/questions/11497457/...
eonil

1
请参阅我的更新答案git archive现在(2017年第四季度)更精确,并且不包括空文件夹。
VonC

1
别客气。显然,您的评论被标记并删除了…… chat.stackoverflow.com/transcript/134259
VonC

Answers:


75

git命令与您所寻找的最接近git archive
请参阅备份使用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 "/"

注意:不适用于GitHub(不受支持)

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

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 --git-dir命令git的选项,而不是git clone


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

git archive”,尤其是当与pathspec一起使用时,即使Git本身从未这样做,它也会在其输出中存储一个空目录。
此问题已解决。

参见RenéScharfe(``)的commit 4318094(2017年9月12日
建议者:Jeff King(peff
(由Junio C gitsterHamano合并--commit 62b1cb7中,2017年9月25日)

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

虽然git不会跟踪空目录,但git archive可以将其放入存档中。
尽管对象数据库支持该功能,但是它无法在索引中表示,因此不太可能在野外发生。

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


4
这对我有用。我还要再添加一件事。如果您根本不关心.git文件夹,那么我将使用以下命令:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky 2015年

这不会删除该文件夹。git的
aliasav

@VonC我尝试:GIT中--git-DIR =的/ dev / null的克隆--depth = 1 / URL /到/回购
aliasav

1
跑步git archive --remote=https://github.com/pornel/dssim.git @ | tar -t我得到tar: This does not look like a tar archive。它不适用于GitHub吗?还有,这是什么@意思?
安德烈·沃朗(AndréWerlang)

2
@AndréWerlang7年后...我不太确定@:我已将其删除。GitHub也不支持远程git archive:我已经编辑了答案以提出替代方案。
VonC


42

您可以创建一个浅表克隆,以仅获取最近的几个修订:

 git clone --depth 1 git://url

然后只需删除.git目录或用于git archive导出树即可。


当我通过重复克隆来更新此错误时,如何防止此错误:“致命:目标路径'XYZ'已经存在,并且不是空目录。”
Sohail Si

1
@SohailSi:克隆到新位置或删除旧目录。如果要更新本地副本,最好获取新的修订版。
knittl

3

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

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


感谢那。这些文件位于git仓库中。我希望能够指导Mac用户在一行中获得该存储库的副本,而不必成为GIT存储库。
Dan Rosenstark 2010年

如果人们不能使用代码,则不应让他们直接从存储库中获取代码(即没有Git存储库)。
替代

@Amoss释放tarball,以便人们不会经常获取最新代码?
可替代

1
@mathepic:要释放tarball,您需要一种从存储库中获取干净的工作副本的方法-正是这个问题。
安德鲁(Andrew)2010年

1
阅读下面的答案,然后再进行一次谷歌搜索,就会引出另一个问题:stackoverflow.com/questions/160608 / ...如果您查看git archive --remote的使用,那么它确实可以完成您的工作(以及原始海报) ) 正在找。编辑:这是乔恩回答的低下。
安德鲁

2

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


5
那就是我要问的问题:如何使用git ...不过我已经知道,从我得到的答案来看,没有内置的方法可以做到这一点。不管怎么说,还是要谢谢你!
Dan Rosenstark 2010年

2

git checkout -f

还有另一种方法可以通过从工作树中拆分存储库来实现。

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

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

mkdir workingfiles
mkdir barerepo.git

初始化一个裸git repo:

cd barerepo.git
git --bare init 

然后创建一个接收后钩子:

touch hooks/post-receive
chmod ug+x hooks/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/。但是/workingfiles/它本身不受版本控制。运行git status/workingfiles/会给出错误fatal: Not a git repository (or any parent up to mount point /data)。这只是普通文件。

与其他解决方案不同,rm -r .git不需要命令,因此,如果/workingfiles/有其他git repo,则不必担心用于删除其他repo的git文件的命令。


1
同意 此处可以在裸仓库上进行后接收挂钩。+1
VonC '18年

如果您只是想获取文件,请做很多工作
Rainb

如果您只需要定期的文件,则不需要很多工作。
大满贯

-2

非常简单的恕我直言:

  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

希望这会有所帮助。


2
谢谢,这会有所帮助,但这是对问题的重述。我们有数千种删除.git目录的方法。
Dan Rosenstark
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.