Mercurial:“hg push”到 smb 共享不起作用

Posted

技术标签:

【中文标题】Mercurial:“hg push”到 smb 共享不起作用【英文标题】:Mercurial: "hg push" to smb share does not work 【发布时间】:2016-09-23 09:13:14 【问题描述】:

我使用 Ubuntu 16.04 和 Mercurial 3.7.3。我们的存储库只能作为 SMB 共享访问。我将共享克隆到我的主文件夹中的一个文件夹(我稍微简化了名称):

> hg clone "/run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo" Repo

我的问题是我可以做任何事情(拉、提交等),但推送:

> hg push -v
pushing to /run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo
searching for changes
2 changesets found
uncompressed size of bundle content:
     876 (changelog)
     724 (manifests)
     586  a.txt
    2869  b.txt
   34900  c.rpm
   37325  d.rpm
abort: Operation not supported: '/run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo/.hg/store/journal'

如果我使用 sudo:

> sudo hg push -v
[sudo] password for kol: 
pushing to /run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo
abort: repository /run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo not found!

提前感谢您的帮助!

更新

我在 Windows 7 中尝试了同样的方法,hg push 工作正常。

更新 2

SMB 共享位于 Windows 计算机上。

hg push 在 Ubuntu 上使用 --debug 选项的输出(我尝试推送的提交与上述不同):

> hg push -v --debug
pushing to /run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo
query 1; heads
searching for changes
all remote heads known locally
listing keys for "phases"
checking for updated bookmarks
listing keys for "bookmarks"
listing keys for "bookmarks"
1 changesets found
list of changesets:
9ce3f6fbf7217a7eea79cf21ccbb2d7fc851cbd3
bundle2-output-bundle: "HG20", 4 parts total
bundle2-output-part: "replycaps" 155 bytes payload
bundle2-output-part: "check:heads" streamed payload
bundle2-output-part: "changegroup" (params: 1 mandatory) streamed payload
bundle2-output-part: "pushkey" (params: 4 mandatory) empty payload
abort: Operation not supported: '/run/user/1000/gvfs/smb-share:server=xyz.com,share=abc$/Repo/.hg/store/journal'

【问题讨论】:

SMB 服务器在哪个系统(Linux / Windows 等)上运行? 另外,如果添加--debug 作为参数提供有用的信息,你能试试吗?当您尝试推送时,dmesg 是否显示任何有趣的东西?运行 dmesg | tail -f 可能有助于了解正在发生的事情。 @ManuelJacob 请看我的第二次更新。 @kol 挂载点很奇怪......如果你通过其他工具挂载你的 smb 文件共享,如cifs-utils 我遇到了同样的问题并遵循了@Vincent 的建议。我可以用 cifs 推动我不能用 gvsd 的地方。我必须在 /etc/fstab 中添加一行,以便使用 user 选项将 cifs 挂载为非 root,并为 samba 共享指定我的 username。 (存在安全问题,我很乐意每次挂载时都输入密码,替代方案包括凭据文件,有关详细信息,请参阅 mount.cifs 文档) 【参考方案1】:

由于某种原因,这似乎不适用于挂载 GVFS 的目录。不过,CIFS 有效。因此,要推送到远程存储库,请通过 CIFS 挂载它。

sudo mount -t cifs -o user=your_remote_username,domain=your_remote_domain,uid=$(id -u),gid=$(id -g) "//remote.server.com/path/to/remote/directory" /media/your_user/smb-mount

确保设置您的远程 (SMB) 用户名​​和域。此外,如果服务器发送文件的所有权信息,可能需要添加forceuid,forcegid 选项。有关该命令的完整说明,请参阅Mount cifs Network Drive: write permissions and chown。

【讨论】:

【参考方案2】:

请不要将网络文件系统用于任何版本控制系统。网络文件系统违反了大多数版本控制系统所依赖的一些一致性保证 - 您在日志文件中看到的几乎肯定是它的副作用。

相反,您可以在同一台机器上运行 http hg 服务器吗?这将显着降低您丢失数据的风险。

【讨论】:

以上是关于Mercurial:“hg push”到 smb 共享不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用Mercurial&Tortoisehg

从集市迁移到mercurial?

突击Mercurial SCM(HG)13---回退到指定版本

sh Mercurial(HG)到GIT

从 Mercurial 迁移到 Git

Mercurial:迁移到新的存储库结构 - 子存储库更新