我如何git签出一个特定的目录并剥离该目录的路径?

我如何git签出一个特定的目录并剥离该目录的路径?,git,Git,我有一个mono repo,希望将所有文件从一个路径签出到我的web服务器上的一个目录中 我知道我可以通过执行以下操作来签出目录:git checkout origin/master--path/to/directory,但这将为我提供path/to/directory中的文件 我想要签出文件,从远程目录,在我的当前目录。所以我尝试了git--worktree=。签出源/主--路径/到/目录。但这不会改变输出目录路径 现在,我只是移动文件,但这很快就会变得单调乏味(mvpath/to/direc

我有一个mono repo,希望将所有文件从一个路径签出到我的web服务器上的一个目录中

我知道我可以通过执行以下操作来签出目录:
git checkout origin/master--path/to/directory
,但这将为我提供
path/to/directory
中的文件

我想要签出文件,从远程目录,在我的当前目录。所以我尝试了
git--worktree=。签出源/主--路径/到/目录
。但这不会改变输出目录路径

现在,我只是移动文件,但这很快就会变得单调乏味(
mvpath/to/directory/*。
)。有没有git命令可以帮助我


这个问题类似于这个未回答的问题:

我会在这里写一个脚本
签出\u git\u dir\u和\u move\u file\u。sh

git checkout origin/master -- $1
mv $1/* .
rmdir -p $1
然后将其放入
~/bin
。然后你可以从任何地方呼叫它


Git是一个命令行工具,所以编写shell脚本来处理类似的事情是很自然的。许多更复杂的git任务都需要显式脚本。

虽然git可以用作部署工具,但还有更好的替代方案。但是,我们将Git用于一个非常类似的任务,它应该适合您。但是,这假设您的目的只是“签出”文件,而不是将更改提交回存储库

在本例中,我们有一个存储库,其中包含用于不同类型测试服务器的Bash、Perl和其他脚本的集合。由于相似性和出于理智的考虑,我们将它们保存在每个服务器的单独目录下的一个存储库中,而不是每个服务器的存储库中

为了在给定的服务器上部署脚本,比如说
ServerA
,我们首先在本地创建存储库的镜像克隆

cd /opt/repos
git clone --mirror https://repo.mycompany.com/git/admin_repo
将更改提交到主存储库时更新镜像的操作如下:

cd /opt/repos/admin_repo.git
git fetch --all
对于此服务器和其他服务器,脚本位于
/usr/local/cscripts
中。要提取存储库中
服务器/cscripts
下包含的ServerA脚本,请使用以下命令

cd /usr/local/cscripts
rm -rf *
git archive --remote=/opt/repos/admin_repo.git HEAD:server_a/cscripts | tar -x
本质上,生成的tarball会立即提取到当前目录中,而不考虑存储库的路径。这不是一个完美的解决方案,因为文件名或子目录布局中的更改不会自动应用,因此
rm--rf
可以确保一张白纸

编辑: 我没有提到我们使用存储库的镜像,因为我们当前的存储库服务器只使用简单的HTTPS,不支持
git:
或智能HTTPS。如果您的存储库已经是本地的,或者维护在更好的服务器上
存储库服务器,无需镜像即可直接提取存档。

git checkout
本身不允许您执行所描述的操作。但是,为什么您会发现移动文件会变得单调乏味?为什么不直接运行
git checkout…&&mv…
?听起来好像您正在尝试对web服务器进行部署?如果是这样,我会寻找特定于该任务的工具(或者至少创建一些shell脚本)。可能使用
--git dir=
。我知道如何解决这个问题,但这并不能使我成为更好的git用户,也不能回答我的问题。如果您想从100GB的repo签出1MB文件夹,这是非常低效的,因为您的第一个命令将首先签出100GB