【问题标题】:Git: Checkout only files without repository?Git:只签出没有存储库的文件?
【发布时间】:2011-02-21 10:07:14
【问题描述】:

我只想签出没有 .git 文件和整个存储库的文件。这是因为我想用 git 管理一个网站(php 和 html),并且我正在寻找一种简单的方法来从存储库更新 htdocs 文件夹中的文件,而无需公开存储库。 (现在它位于 home-dir 并通过 ssh 访问,但我必须手动将新文件放入 htdocs。

【问题讨论】:

  • 离开 .git 并让您的网络服务器阻止访问它可能会更容易
  • 这个关于模拟 Svn 导出的问题的答案可能正是您所需要的:stackoverflow.com/questions/160608/…

标签: git


【解决方案1】:

git-archive 联机帮助页包含以下示例:

git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)

创建一个包含当前分支最新提交内容的 tar 存档,并将其解压到 '/var/tmp/junk' 目录中。

或者您可以使用低级别的git-checkout-index,该手册页包含以下示例:

使用 git checkout-index “导出整棵树”

前缀能力基本上使得使用'git checkout-index'作为“导出为树”功能变得微不足道。只需将所需的树读入索引,然后执行

   $ git checkout-index --prefix=git-export-dir/ -a

git checkout-index 会将索引“导出”到指定目录中。

最后的“/”很重要。导出的名称实际上只是以指定的字符串为前缀。

或者您可以尝试使用 --work-tree 选项来 git wrapper 或 GIT_WORK_TREE 环境变量,例如通过使用“git --work-tree=/somwehere/else checkout -- .”。

【讨论】:

  • git-archive 非常适合这个。此外,您还可以使用 git archive --remote 直接从远程存储库(甚至通过 git:// 协议 iirc)构建存档,因此将其用作直接从中心点获取的一种方式。例如git archive --remote git://git/mindy.git --format tar r3.2.0 | tar tf -(前提是你在 git-daemon 配置中启用了上传归档)
  • @araqnid 可能很酷但不适用于 Github:使用 ssh URL Invalid command: 'git-upload-archive 时,使用 https URL 时:fatal: Operation not supported by protocol.
  • git checkout-index 就像一个魅力,但请确保为 --prefix 参数使用绝对路径。我尝试了~/…,实际上在我的工作目录中有一个~ 目录(因此,请改用/Users/aral/…
【解决方案2】:

git clone --depth 1 完全符合您的要求。我有一个包含 41,000 次提交的 git 存储库,这要快得多。更详细的解释见this answerthis more general response

如果您想指定要使用的分支(而不是默认的“主”分支),请使用以下语法(需要 Git 1.9+):

git clone -b <remoteBranch> --single-branch --depth 1 ssh://username@servername.net:serverport/PathToProject <FolderName>

【讨论】:

    【解决方案3】:

    在这一点上,Git 比 Subversion 容易得多,因为整个存储库都保存在一个目录中。您只需要删除项目根目录中隐藏的“.git”文件夹即可创建您网站的生产就绪副本。

    在 Linux/OSX 中,这将是:

    mkdir dist && cd dist
    git checkout --depth=1 http://path/to/your/project.git
    rm -rf .git
    

    【讨论】:

    • 这有复制整个历史记录的缺点......如果它是一个大型回购和网络,它可能会很慢。
    • 我认为问题是要尽量减少网络使用量,而diff 计算...在其他方面尽量减少资源使用量。
    • 您可能是对的,其他一些答案更适合这些情况,但该问题并不要求对性能至关重要的答案。这种方法对于许多工作流来说是简单且可行的,特别是如果 repo 已经在目标机器上签出。我会继续列出它,因为有些人觉得它很有用。
    • 我对这个答案的唯一修改是使用--depth=1 来防止下载整个历史记录。由于.git最终将被删除,使用--depth=1允许跳过最终不会保留的信息的传输,并且不会改变最终结果。至于这个答案的用处:我更愿意使用git archive,但正如that answer Github 不支持git archive 下所指出的,所以我不能使用它。下一个最好的事情是git checkout --depth=1 ... &amp;&amp; rm -rf .git
    【解决方案4】:

    您可以在 git 工作目录中创建一个 tar 存档并将 tar 复制到服务器:

    git archive -o foo.tar HEAD
    scp foo.tar server:
    

    【讨论】:

      【解决方案5】:

      扩展 seanhodges 答案,您可以将项目的文件同步到您需要放置它们的任何位置,并使用 --exclude 来避免 .git 目录。

      rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
      

      我没有测试那个命令,所以随意编辑它,但你明白了。

      一个有用的选项是将 --dry-run 添加到命令的末尾,这将显示将发送哪些文件而无需实际进行任何更改。

      【讨论】:

        【解决方案6】:

        你可能会受益于一个裸回购加上 post-receive 钩子。

        如果您希望将更改推送到服务器但不希望 htdocs 本身受版本控制,则此方法很有用。

        我们将为裸 git 存储库创建一个文件夹。我喜欢把它和 htdocs 放在同一个父文件夹中:

        mkdir barerepo.git
        cd barerepo.git
        git --bare init 
        

        然后创建一个 post-receive 钩子文件,使其可执行:

        touch hooks/post-receive
        chmod ug+x hooks/post-receive
        

        在您喜欢的文本编辑器中编辑 post-receive:

        GIT_WORK_TREE=/full/path/to/htdocs git checkout -f
        # optional stuff:
        cd down/to/some/directory
        [do some stuff]
        

        现在每次推送到这个裸仓库时,它都会将工作树签出到 htdocs。但是 htdocs 本身不受版本控制;在 htdocs 中运行 git status 将给出错误 fatal: Not a git repository (or any parent up to mount point /data)。这只是普通文件。

        请注意,您必须始终从 master 推送,否则 git checkout 将不知道要签出哪个分支。

        【讨论】:

          猜你喜欢
          • 2012-09-09
          • 1970-01-01
          • 2019-08-14
          • 2016-07-08
          • 2012-11-16
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          相关资源
          最近更新 更多