我想克隆一个GIT仓库,而不是最后一个.git目录。换句话说,我只想要文件。有没有办法做到这一点?
git clone --no-checkout与我想要的东西完全相反(只给我.git目录)。
我正在尝试针对远程回购而不是本地回购,这不是 “ 如何进行“ git导出”(如“ svn导出”) ” 的重复(即使解决方案最终可能是相同)。
我想克隆一个GIT仓库,而不是最后一个.git目录。换句话说,我只想要文件。有没有办法做到这一点?
git clone --no-checkout与我想要的东西完全相反(只给我.git目录)。
我正在尝试针对远程回购而不是本地回购,这不是 “ 如何进行“ git导出”(如“ svn导出”) ” 的重复(即使解决方案最终可能是相同)。
Answers:
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 "/"
因此,您需要克隆(浅化以加快克隆步骤),然后在本地存档:
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文件来对其进行跟踪和存档。
git --git-dir=/dev/null clone --depth=1 /url/to/repo
git archive --remote=https://github.com/pornel/dssim.git @ | tar -t我得到tar: This does not look like a tar archive。它不适用于GitHub吗?还有,这是什么@意思?
@:我已将其删除。GitHub也不支持远程git archive:我已经编辑了答案以提出替代方案。
git archive --format=tar --remote=<repository URL> HEAD | tar xf -
从这里取
--format=tar是没有必要的。“ tar”是默认输出,无需指定。
tar x已足够
为什么不执行克隆然后删除.git目录,以便仅拥有裸露的工作副本?
编辑:或者实际上为什么根本不使用克隆?当您说您想要一个git repo但没有.git目录时,这有点令人困惑。如果您只是想获取树的某些状态的副本,那为什么不在cp -RShell中而不是git clone中删除,然后再删除.git。
听起来您只想要源代码的副本。如果是这样,为什么不复制目录并从副本中排除.git目录呢?
还有另一种方法可以通过从工作树中拆分存储库来实现。
如果您需要定期更新这些无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文件的命令。
非常简单的恕我直言:
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
希望这会有所帮助。
.git目录的方法。