Git Clone:请给我一些文件?

时间:2010-10-15 22:16:29

标签: git

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

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

我正在尝试为远程回购而不是本地回购,这意味着不是“How to do a “git export” (like “svn export”)”的重复(即使解决方案最终可能会一样。)

9 个答案:

答案 0 :(得分:65)

与您正在寻找的最接近的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 --git-dircommand git的选项,而不是git clone


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

  

git archive”,特别是与pathspec一起使用时,存储为空   输出中的目录,即使Git本身从未这样做过   这已得到修复。

commit 4318094René Scharfe (``)(2017年9月12日) 建议:Jeff King (peff)
Junio C Hamano -- gitster --合并于commit 62b1cb7,2017年9月25日)

  

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

     

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

     

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

答案 1 :(得分:57)

git archive --format=tar --remote=<repository URL> HEAD | tar xf -

取自here

答案 2 :(得分:38)

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

 git clone --depth 1 git://url

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

git checkout -f

通过从工作树中拆分回购,还有另一种方法可以做到这一点。

如果您需要定期更新这些git-less git文件,此方法很有用。例如,当我需要检查源文件并构建工件时,我使用它,然后将工件复制到另一个仅用于部署到服务器的repo中,并且当我想要时将源代码推送到服务器时我也使用它结帐并构建到www目录的源代码。

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

mkdir workingfiles
mkdir barerepo.git

初始化一个简单的git repo:

cd barerepo.git
git --bare init 

然后创建一个post-receive hook:

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的命令文件。

答案 6 :(得分:1)

无需在att处使用git,只需在URL(source)后面附加“ / zipball / master /”。

下载

此解决方案最接近github页面上的“下载ZIP”按钮。优点之一是缺少.git目录。另一个-下载单个ZIP文件而不是一个文件一个,这可能会带来很大的不同。可以通过wget wget -O "$(basename $REPO_URL)".zip "$REPO_URL"/zipball/master/从命令行完成。唯一的问题是,某些存储库可能根本没有master分支。在这种情况下,URL中的“主”应替换为适当的分支。

解压缩

一旦存在ZIP,最终的未压缩目录名称可能仍然很怪异和意外。要解决此问题,可以通过this script提取名称,并将mv编入URL的basename。最终script.sh可能看起来像(处理空格的最佳方法):

#Script for downloading from github. If no BRANCH_NAME is given, default is "master".
#usage: script.sh URL [BRANCH_NAME]
__repo_name__='basename "$1"'
__repo_name__="$(eval $__repo_name__)"
__branch__="${2:-master}"
#downloading
if [ ! -e ./"$__repo_name__"".zip" ] ; then
wget -O "$__repo_name__"".zip" "$1""/zipball/$__branch__/"
fi
#unpacking and renaming
if [ ! -e ./"$__repo_name__" ] ; then
unzip "$__repo_name__"".zip" && 
__dir_name__="$(unzip -qql $__repo_name__.zip | sed -r '1 {s/([ ]+[^ ]+){3}\s+//;q}')" &&
rm "$__repo_name__"".zip" &&
mv "$__dir_name__" "$__repo_name__"
fi

维护

这种方法应该用于“仅文件”的工作,这对于快速一次性使用小型存储库非常有用。

但是。如果源相当大,并且唯一的更新可能性是下载并重建所有文件,那么(据我所知)没有可能更新少.git的目录,因此完整的回购协议必须再次下载。那么最好的解决方案是-如VonC所解释的那样-坚持使用浅拷贝git clone --depth 1 $REPO_URL。但是接下来呢?要“检查更新”,请参见link,要进行更新,请参见类似Wiki的出色answer

答案 7 :(得分:0)

git --work-tree = / tmp / files_without_dot_git clone --depth = 1 https://git.yourgit.your.com/myawesomerepo.git / tmp / deleteme_contents_of_dot_git

答案 8 :(得分:-1)

非常简单的恕我直言:

  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

希望这会有所帮助。