所以这就是我正在使用的:
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
有效。
有什么想法吗?
答案 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,
}