我想克隆一个GIT仓库而不是以.git
目录结束。换句话说,我只想要文件。有没有办法做到这一点?
git clone --no-checkout
与我想要的完全相反(只给了我.git
目录。)
我正在尝试为远程回购而不是本地回购,这意味着不是“How to do a “git export” (like “svn export”)”的重复(即使解决方案最终可能会一样。)
答案 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-dir
是command git
的选项,而不是git clone
。
使用Git 2.14.X / 2.15更新(2017年第4季度):确保避免添加空文件夹。
“
git archive
”,特别是与pathspec一起使用时,存储为空 输出中的目录,即使Git本身从未这样做过 这已得到修复。
commit 4318094见René 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-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)
非常简单的恕我直言:
git clone REPO_URL
.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
希望这会有所帮助。