如何git checkout特定目录并删除该目录的路径?

时间:2017-01-07 14:21:01

标签: git

我有一个单声道回购,想要将路径中的所有文件签出到我的网络服务器上的目录中。

我知道我可以通过执行:git checkout origin/master -- path/to/directory来检查目录,但这会在path/to/directory中提供我的文件。

我想要远程目录中的结帐文件在我当前的目录中。所以我尝试了git --work-tree=. checkout origin/master -- path/to/directory。但这不会改变输出目录路径。

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

这个问题类似于这个悬而未决的问题:Git checkout to specific directory

2 个答案:

答案 0 :(得分:1)

我会写一个脚本checkout_git_dir_and_move_file_here.sh

git checkout origin/master -- $1
mv $1/* .
rmdir -p $1

并将其放在~/bin中。然后你可以从任何地方调用它。

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

答案 1 :(得分:1)

虽然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。要在server_a/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。如果您的存储库已经在本地或维护得更好 存储库服务器,您可以在没有镜像的情况下直接提取存档。