Git with Bash:导出子目录而不获取父文件夹

Posted

技术标签:

【中文标题】Git with Bash:导出子目录而不获取父文件夹【英文标题】:Git with Bash : exporting a subdirectory without getting the parent folder 【发布时间】:2015-12-12 23:58:17 【问题描述】:

我有一个小小的个人网站。

为了学习新事物,我在我的网站上使用 git,我想创建一个 bash 脚本来执行这些步骤:

    识别最后一个标签版本 将此版本签出到特定于发布的文件夹(因此我当前的工作不会被删除) 缩小 css 文件 上传到我的ftp

对于只有index.htmlstyle.css 的网站来说,这完全是矫枉过正,但这只是为了学习新知识。 :)

我目前处于第二步,这项工作做得很好,但我想把它做得更好一点。

首先,让我们来解释一下树形视图,它看起来像这样:

/  
- scripts  
-- livraison  
- site  
-- index.html  
-- style.css

我的父文件夹中有两个子文件夹,scriptssitescripts 不包含任何 js 脚本,我网站的所有源代码都在 site 中。事实上,scripts 确实包含我的 bash 脚本 livraison,它将执行发布。

所以我只需要签出site 文件夹并将其放入我将命名为site_livraison 的发布子文件夹中

经过一番研究,我想出了这个 MWE:

#!/bin/bash
# Getting last tag version
dernierTag=$(git describe --tags `git rev-list --tags --max-count=1`)
echo 'Dernière version identifiée :' $dernierTag'.'
echo

# Emptying / Creating my release folder
echo 'Réinitialisation du répertoire "site_livraison".'
rm -Rf ../site_livraison
mkdir ../site_livraison
echo 'Réinitialisation du répertoire "site_livraison" terminée.'
echo

# Website source code checkout
echo 'Récupération de la version' $dernierTag' dans le répertoire "site_livraison".'
git --work-tree=../site_livraison checkout -f $dernierTag -- site

# Doing another checkout for going back to the master branch (if not I stay on my previous tag version and it mess up the git status command when I go back to developement)
git checkout -f master

echo 'Récupération de la version' $dernierTag' dans le répertoire "site_livraison" terminée.'
echo

我的问题是在我的脚本执行后我得到了这个树视图:

/  
- scripts  
-- livraison  
- site  
-- index.html  
-- style.css  
- site_livraison  
-- site  
--- index.html  
--- style.css

我想要这个:

/  
- scripts  
-- livraison  
- site  
-- index.html  
-- style.css  
- site_livraison  
-- index.html  
-- style.css

在检查时有什么方法可以在git 命令中执行此操作,还是我需要获取所有文件并在我的树形视图中“向上”,然后删除 --site 文件夹?

【问题讨论】:

首先:从 2.5 版开始使用 git has a tool 创建一个额外的工作树。在此工具的早期版本中,git-new-workdir 可作为贡献者使用。你不需要用发布代码弄乱你的工作仓库 然后:git checkout,好吧,只需检查给定状态的源代码树。因此,如果您需要移动内容,则需要在提交中更改源树,或者,在结帐后应用这些更改。 git 本身并没有神奇的工具可以立即重写你的源代码树,你只能创建一个额外的脚本来为你做这件事。 我的操作系统是 Debian,我在 Synaptic 中的当前 Git 版本是 2.1.4。我不能使用 git worktree,必须使用 git-new-workdir。感谢您的帮助! 【参考方案1】:

一些解决方案是:

    将项目拆分为多个存储库。将您的 scriptssite 保存在他们自己的存储库中,然后您可以分别单独签出。存储库中不会有额外级别的目录可供解决。 #1 的另一个变化是使用 3 个存储库。 scriptssite 各有 1 个 repo,然后是包含 git 的 repo,将前两个视为 submodules。 将您的工作site_livraison 提取到同一棵树之外,然后将mv 仅从该外部树中的site 子目录提取到您想要的位置。这棵树将不再是 git 存储库,但如果它只是出于临时目的,可能是无害的。

【讨论】:

嗨,由于命令 git --work-tree=../site_livraison checkout -f $dernierTag -- site,我没有得到我的 scripts 存储库。 --site 表示我只想签出 site 存储库。 感谢您的帮助。我成功地做到了。 :)

以上是关于Git with Bash:导出子目录而不获取父文件夹的主要内容,如果未能解决你的问题,请参考以下文章

我可以将变量从 Bash 脚本导出到环境而不使用它吗?

在 Git Bash 的 Windows 安装中更改 ~ 目录的位置

在 bash 脚本中为 git 提供密码

Git直接从原点导出

如何在 Windows 的 Git Bash 中设置别名?

在 git bash 中生成 SSH 密钥,我无法获取 git 代理