我有一个单声道回购,想要将路径中的所有文件签出到我的网络服务器上的目录中。
我知道我可以通过执行: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
答案 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。如果您的存储库已经在本地或维护得更好
存储库服务器,您可以在没有镜像的情况下直接提取存档。