问题 做一个“混帐出口”(如“SVN出口”)?
我一直想知道是否有一个好的“git export”解决方案可以创建一个没有的树的副本 .git 存储库目录。我知道至少有三种方法:
git clone 然后删除 .git 存储库目录。
git checkout-index 提到这个功能,但开头是“只需将所需的树读入索引...”,我不完全确定如何做。
git-export 是第三方脚本,基本上是一个 git clone 进入临时位置 rsync --exclude='.git' 进入最终目的地。
这些解决方案都没有让我感到满意。最接近的一个 svn export 可能是选项1,因为这两个要求的目标目录是空的第一个。但是选项2似乎更胜一筹,假设我能弄清楚这是什么意思读一棵树到索引。
904
2017-10-02 02:21
起源
答案:
实现这一目标的最简单方法可能就是 git archive。如果你真的需要扩展树,你可以做这样的事情。
git archive master | tar -x -C /somewhere/else
大多数时候我需要从git“导出”某些东西,我想要一个压缩存档,所以我做这样的事情。
git archive master | bzip2 >source-tree.tar.bz2
ZIP存档:
git archive --format zip --output /full/path/to/zipfile.zip master
git help archive 有关详细信息,它非常灵活。
请注意,即使存档不包含.git目录,它也会包含其他隐藏的git特定文件,如.gitignore,.gitattributes等。如果您不想在存档中使用它们,请确保使用.gitattributes文件中的export-ignore属性,并在进行归档之前提交此属性。 阅读更多...
注意:如果您对导出索引感兴趣,则命令为
git checkout-index -a -f --prefix=/destination/path/
(看到 格雷格的回答 更多细节)
2198
2017-10-02 18:13
我发现了2选项意味着什么。从存储库中,您可以执行以下操作:
git checkout-index -a -f --prefix=/destination/path/
路径末尾的斜杠很重要,否则会导致文件位于/ destination中,前缀为“path”。
由于在正常情况下索引包含存储库的内容,因此“将所需的树读入索引”没有什么特别之处。它已经存在了。
该 -a flag需要检查索引中的所有文件(我不确定在这种情况下省略此标志意味着什么,因为它不能做我想要的)。该 -f 标志强制覆盖输出,此命令不通常做任何现有的文件。
这似乎是一种“混帐出口”我一直在寻找的。
301
2017-10-02 03:03
git archive 也适用于远程存储库。
git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -
要在repo中导出特定路径,请添加尽可能多的路径作为git的最后一个参数,例如:
git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
241
2017-12-09 18:59

如果存储库托管在GitHub上,则应回答特殊情况。
只是用 svn export。
据我所知,Github不允许 archive --remote。虽然GitHub是 svn兼容 他们确实有所有的git回购 svn 可访问,所以你可以使用 svn export 就像你通常会与您的GitHub网址一些调整。
例如,要导出整个存储库,请注意如何 trunk在URL替换 master (或者不管怎样 project的HEAD分支设置为):
svn export https://github.com/username/repo-name/trunk/
您可以导出单个文件甚至某个路径或文件夹:
svn export https://github.com/username/repo-name/trunk/src/lib/folder
该 HEAD 分支或 主 分支将可用 trunk:
svn ls https://github.com/jquery/jquery/trunk
非HEAD 分支机构 将在下面访问 /branches/:
svn ls https://github.com/jquery/jquery/branches/2.1-stable
所有 标签 下 /tags/ 以同样的方式:
svn ls https://github.com/jquery/jquery/tags/2.1.3
48
2017-10-30 17:03
来自 Git手册:
使用git-checkout-index“导出整个树”
前缀能力基本上使得git-checkout-index用作“export as tree”函数变得微不足道。只需将所需的树读入索引,然后执行:
$ git checkout-index --prefix=git-export-dir/ -a
38
2017-10-02 02:27
我写了一个简单的包装器 git-checkout-index 你可以像这样使用:
git export ~/the/destination/dir
如果目标目录已存在,则需要添加 -f 要么 --force。
安装简单;把脚本放在你的某个地方 PATH,并确保它是可执行的。
github存储库 git-export
37
2017-10-16 17:17
看起来这对于Git来说不像SVN那么严重。 Git只在存储库根目录中放置一个.git文件夹,而SVN在每个子目录中放置一个.svn文件夹。所以“svn export”避免了递归命令行魔术,而Git递归则没有必要。
35
2018-05-12 04:20
相当于
svn export . otherpath
在现有的回购中是
git archive branchname | (cd otherpath; tar x)
相当于
svn export url otherpath
是
git archive --remote=url branchname | (cd otherpath; tar x)
26
2018-02-23 15:41
我广泛使用git-submodules。
这个对我有用:
rsync -a ./FROM/ ./TO --exclude='.*'
21
2017-09-13 06:26
如果您不排除文件 .gitattributes export-ignore 然后试试 git checkout
mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q
-F
检查索引中的路径时,请勿在未合并时失败
项;相反,未合并的条目将被忽略。
和
-q
避免冗长
此外,您可以获取任何分支或标记,或者从SVN中的特定提交修订版添加SHA1(Git中的SHA1等同于SVN中的修订号)
mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./
该 /path/to/checkout/ 必须为空,Git不会删除任何文件,但会覆盖具有相同名称的文件而不会发出任何警告
更新:
为了避免斩首问题或者在使用checkout导出标签,分支或SHA1时保持工作存储库的完整性,您需要添加 -- ./ 最后
双击 -- 告诉git破折号后的所有内容都是路径或文件,并且在这种情况下也会告诉我 git checkout 不改变 HEAD
例子:
此命令将只获取libs目录以及 readme.txt 完全提交的文件
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt
这将创建(覆盖) my_file_2_behind_HEAD.txt 两个承诺在头后面 HEAD^2
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt
获得另一个分支的导出
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./
请注意 ./ 是相对于存储库的根目录
20
2017-12-10 17:17
这将复制所有内容,减去.dot文件。我使用它来将git克隆的项目导出到我的web应用程序的git repo而没有.git的东西。
cp -R ./path-to-git-repo / path / to / destination /
普通的老bash工作得很好:)
16
2018-01-22 17:31