无法使用vcsrepo签出git ssh存储库

时间:2012-12-13 11:28:50

标签: git ubuntu-12.04 puppet

所以这就是我正在使用的:

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

有效。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

可能你不想使用强制,因为每次你应用你的清单时,这会导致git repo被删除和克隆,或者只是吹走一个可能无法替换的无关文件的目录!相反,我建议你看一下git provider's source code。在那里,您可以确切地看到正在做什么来确定是否存在回购。具体来说,是working_copy_exists?方法。

在我的情况下,失败的原因是我已经指定了一个ssh:// url - 但现有的repo已经克隆(通过ssh),其中包含git@example.com:EXAMPLE/example.git这样的URL。这意味着当working_copy_exists?方法检查回购中的.git/config寻找ssh://的地址时,它无法找到它!这导致vcsrepo假定目录内容不相关并且没有强制失败。

URL检查只是该方法中的几种之一,因此,如果这不是正确识别您的工作副本的原因,那么它可能是其他检查之一。

答案 1 :(得分:1)

如果目标目录存在为非空,则为克隆仓库添加强制选项。

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.

答案 2 :(得分:0)

基于此讨论 https://groups.google.com/d/msg/puppet-users/ke5Nk1qwGGs/37dFA3tr5rIJ 以及个人经历,

vcsrepo想要创建目录。

因此,如果$ base_dir为/ tmp / foo / bar / baz,则只存在thge / tmp / foo / bar目录。

另外,为了使ssh正常工作(https://github.com/puppetlabs/puppetlabs-vcsrepo/blob/master/README.GIT.markdown#for-sources-that-use-ssh-eg-usernameserver),你必须向vcsrepo添加一个用户属性,以便它获取正确的ssh密钥(令人讨厌,因为它也假设你希望该用户拥有新的克隆回购)。

答案 3 :(得分:-2)

结帐时,您不需要整个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,
}