无法使用vcsrepo checkout git ssh存储库

z5btuh9x  于 2023-01-15  发布在  Git
关注(0)|答案(5)|浏览(155)

这就是我所使用的:

vcsrepo { "$base_dir":
    ensure => latest,
    provider => git,
    source => 'ssh://git@example.com:7999/EXAMPLE/example.git',
    require => File["$base_dir"],
    revision => $branch,
}

当我应用puppet清单时,这会导致一个错误:

Error: Could not create repository (non-repository at path)
Error: /Stage[main]/MyServer::Server/Vcsrepo[/usr/service/myserver]/ensure: change from absent to latest failed: Could not create repository (non-repository at path)

当我这样做:

git clone ssh://git@example.com:7999/EXAMPLE/example.git

它起作用了。
有什么想法吗?

50pmv0ei

50pmv0ei1#

你可能不想使用强制手段,因为这会导致git repo在每次应用manifest时被删除和克隆,或者只是删除一个包含不相关文件的目录,而这些文件可能是不可替换的!相反,我建议你看看git提供程序的源代码,在那里你可以清楚地看到正在做什么来确定repo是否存在。具体来说,working_copy_exists?方法。
在我的例子中,失败的原因是我和您一样指定了ssh://url-但是现有的存储库已经被克隆了这意味着当working_copy_exists?方法检查repo中的.git/config以查找具有ssh://的地址时,它找不到它!这会导致vcsrepo假设目录内容是不相关的,并且会自动失败。
URL检查只是该方法中的几个检查之一,所以如果这不是它不能正确识别工作副本的原因,那么它可能是其他检查之一。

5jdjgkvh

5jdjgkvh2#

如果目标目录以非空的形式存在,请为克隆存储库添加force选项。

vcsrepo { "$base_dir":
    ensure => latest,
    provider => git,
    source => 'ssh://git@example.com:7999/EXAMPLE/example.git',
    require => File["$base_dir"],
    revision => $branch,
    force => true,
}

来源:vcsrepo: git clone doesn't work if destination path already exists.

quhf5bfb

quhf5bfb3#

基于此讨论https://groups.google.com/d/msg/puppet-users/ke5Nk1qwGGs/37dFA3tr5rIJ以及个人经验,
vcsrepo要创建目录。
因此,如果$base_dir是/tmp/foo/bar/baz,则应该只存在/tmp/foo/bar目录。
另外,要使ssh正常工作(https://github.com/puppetlabs/puppetlabs-vcsrepo/blob/master/README.GIT.markdown#for-sources-that-use-ssh-eg-usernameserver),您必须向vcsrepo添加一个用户属性,以便它获取正确的ssh密钥(这很麻烦,因为它还假定您希望该用户拥有新克隆的repo)。

umuewwlo

umuewwlo4#

我认为参数"safe_directory =〉true"是您的朋友。
我在hiera中做了这个,然后,如果目录存在,puppet做一个git pull。
未放入"safe_directory"时出错:真的"。(我在hiera)

zabbix::agent::scripts:
 '/etc/zabbix.includes':
   ensure: 'latest'
   provider: 'git'
   source: 'https://git.x.com/es-public/linux-scripts-test.git'
   group: 'zabbix'
   owner: 'zabbix'

我得到了错误:

Notice: Vcsrepo[/etc/zabbix.includes](provider=git): Removing '/etc/zabbix.includes' from safe directory list
Notice: /Stage[main]/Profiles::Linux::Zabbix_agent/Vcsrepo[/etc/zabbix.includes]/ensure: Creating repository from latest
Error: Path /etc/zabbix.includes exists and is not the desired repository.
Error: /Stage[main]/Profiles::Linux::Zabbix_agent/Vcsrepo[/etc/zabbix.includes]/ensure: change from 'present' to 'latest' failed: Path /etc/zabbix.includes exists and is not the desired repository. (corrective)

然后我把参数"safe_directory:真"

zabbix::agent::scripts:
 '/etc/zabbix.includes':
   ensure: 'latest'
   safe_directory: true
   provider: 'git'
   source: 'https://git.x.com/es-public/linux-scripts-test.git'
   group: 'zabbix'
   owner: 'zabbix'

对git repository的新更改一切正常

Notice: Vcsrepo[/etc/zabbix.includes](provider=git): Adding '/etc/zabbix.includes' to safe directory list
Notice: /Stage[main]/Profiles::Linux::Zabbix_agent/Vcsrepo[/etc/zabbix.includes]/ensure: Updating to latest 'master' revision
Notice: /Stage[main]/Profiles::Linux::Zabbix_agent/Vcsrepo[/etc/zabbix.includes]/ensure: created (corrective)

因为模块在/root/. gitconfig中添加了下一个指令:

root@xxxx:/home/xxxx# cat ~/.gitconfig 
[safe]
    directory = /etc/zabbix.includes

如果我再次执行,模块不会执行任何东西,因为我的git仓库中没有任何更改。
希望这能有所帮助

gj3fmq9x

gj3fmq9x5#

你不需要完整的ssh://路径来结账,这个模块会帮你处理的。
这是从their examples中提取的:

vcsrepo { "/path/to/repo":
    ensure => present,
    provider => git,
    source => "git://example.com/repo.git"
}

你的看起来像:

vcsrepo { "$base_dir":
    ensure => latest,
    provider => git,
    source => 'git://example.com:7999/EXAMPLE/example.git',
    require => File["$base_dir"],
    revision => $branch,
}

相关问题