git - Vagrant - 摊铺机 devstack 错误 : "[Errno 20] Not a directory"

标签 git vagrant devstack edx openedx

我正在尝试通过 Vagrant 安装 edx Devstack,我在 Windows 机器上。我收到的错误似乎是由 Windows 不支持的符号链接(symbolic link)引起的。

根据 Dealing with line endings and symlinks under Windows 下的 edx 故障排除指南,我应该在 cygwin 中运行以下命令来处理符号链接(symbolic link)。

git rm --cached -r . && git reset --hard

git config --global alias.add-symlink '!__git_add_symlink(){
    dst=$(echo "$2")/../$(echo "$1"); 
    if [ -e "$dst" ]; then 
        hash=$(echo "$1" | git hash-object -w --stdin); 
        git update-index --add --cacheinfo 120000 "$hash" "$2"; 
        git checkout -- "$2"; 
    else 
        echo "ERROR: Target $dst does not exist!"; 
        echo "       Not creating invalid symlink."; 
    fi; 
    }; __git_add_symlink "$1" "$2"'

git config --global alias.rm-symlink '!__git_rm_symlink(){
    git checkout -- "$1"; link=$(echo "$1"); 
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    doslink=${link//$POS/$DOS}; 
    dest=$(dirname "$link")/$(cat "$link"); 
    dosdest=${dest//$POS/$DOS}; 
    if [ -f "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //H "$doslink" "$dosdest"; 
    elif [ -d "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //J "$doslink" "$dosdest"; 
    else 
        echo "ERROR: Something went wrong when processing $1 . . ."; 
        echo "       $dest may not actually exist as a valid target."; 
    fi; 
    }; __git_rm_symlink "$1"'

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git rm-symlink "$symlink"; 
        git update-index --assume-unchanged "$symlink"; 
    done; 
    }; __git_rm_symlinks'

git config --global alias.checkout-symlinks '!__git_checkout_symlinks(){
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git update-index --no-assume-unchanged "$symlink"; 
        if [ -d "$symlink" ]; then 
            dossymlink=${symlink//$POS/$DOS}; 
            cmd //C rmdir //S //Q "$dossymlink"; 
        fi; 
        git  checkout -- "$symlink"; 
        echo "Restored git symlink $symlink <<===>> `cat $symlink`"; 
    done; 
    }; __git_checkout_symlinks'

git rm-symlinks

我还尝试了对 Git symlinks in Windows 的 SO 回答中的命令,产生相同的结果。

输出:

运行上述命令后得到的输出有点奇怪,所以我不确定脚本是否成功。

User@Computer /cygdrive/c/.../Local/devstack/edx-platform/edx-platform $./symlinks-fix.sh
**Git checkout output**
...
Checking out files: 100% (6983/6983), done.
HEAD is now at 222bdd9 Merge pull request #10411 from edx/mobile/course-blocks-api

Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.

C:\Users\...\Local\devstack\edx-platform\edx-platform>

为什么最后会进入Windows风格的命令提示符?这是我不确定 git 命令是否正常工作的地方。

在 Vagrant 中:

运行 vagrant upvagrant ssh 后,运行 paver devstack lms 时出现以下错误(与 paver 的输出类似开发栈工作室):

vagrant@precise64:~$ sudo su edxapp
edxapp@precise64:~/edx-platform$ paver devstack lms
...
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/github.txt
  Could not find a tag or branch '96e1922348bfe6d99201b9512a9ed946c87b7e0b', assuming commit.
  .... 20 similar ....
  Could not find a tag or branch 'e7a6c95c300e95c51e42bfd1eba70489c05a6527', assuming commit.

pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/local.txt
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/base.txt
  Requested meliae==0.4.0 (from -r requirements/edx/base.txt (line 47)), but installing version 0.4.0.final.0
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/post.txt
python manage.py cms --settings=devstack reindex_course --setup
2015-11-06 01:37:40,353 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'html'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
2015-11-06 01:37:40,660 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'course_info'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'

Build failed running pavelib.servers.devstack: Subprocess return code: 1

据我所知,这是符号链接(symbolic link)的问题(请参阅 this Google 群组上的帖子)。

我是否正确运行了上述符号链接(symbolic link)脚本?如何检查符号链接(symbolic link)是否已成功处理?

其他尝试:

按照google群里的建议(上面的链接),我也做了如下调整:

  • 设置 VAGRANT_USE_VBOXFS = true
  • 使用提供的 Vagrantfile here
  • 设置环境变量 OPENEDX_RELEASE="named-release/cypress"
  • 从 Vagrant 实例安装 libxmlsec1。

在多次 vagrant destroyvagrant provision 之后,我仍然有相同的 IOError: [Error 20] Not a directory 问题。任何帮助将不胜感激!

版本:

  • Windows 版本:8
  • Vagrant 版本:1.7.4
  • VirtualBox 版本:5.0.8
  • openEdx 版本:named-release/cypress

最佳答案

我认为问题是你的cydrive路径不对造成的。

尝试改变c:\cygwin\etc\fstab

none/cydrive cygdrive binary,posix=0,user 0 0

无/cygdrive 二进制,posix=0,用户 0 0

引用:https://cygwin.com/cygwin-ug-net/using.html#cygdrive

更新:

在 CMD 中键入“bash”,然后复制/粘贴脚本的内容

如果你得到相同的结果尝试:

打开 .gitconfig(使用 Notepad++ 或类似工具)并添加此部分(如果尚不存在)

[alias]
add-symlink = "!__git_add_symlink(){\n    dst=$(echo \"$2\")/../$(echo \"$1\"); \n    if [ -e \"$dst\" ]; then \n        hash=$(echo -n \"$1\" | git hash-object -w --stdin); \n        git update-index --add --cacheinfo 120000 \"$hash\" \"$2\"; \n        git checkout -- \"$2\"; \n    else \n        echo \"ERROR: Target $dst does not exist!\"; \n        echo \"       Not creating invalid symlink.\"; \n    fi; \n    }; __git_add_symlink \"$1\" \"$2\""
rm-symlink = "!__git_rm_symlink(){\n    git checkout -- \"$1\"; link=$(echo \"$1\"); \n    POS=$'/'; DOS=$'\\\\\\\\'; \n    doslink=${link//$POS/$DOS}; \n    dest=$(dirname \"$link\")/$(cat \"$link\"); \n    dosdest=${dest//$POS/$DOS}; \n    if [ -f \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //H \"$doslink\" \"$dosdest\"; \n    elif [ -d \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //J \"$doslink\" \"$dosdest\"; \n    else \n        echo \"ERROR: Something went wrong when processing $1 . . .\"; \n        echo \"       $dest may not actually exist as a valid target.\"; \n    fi; \n    }; __git_rm_symlink \"$1\""
rm-symlinks = "!__git_rm_symlinks(){\n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git rm-symlink \"$symlink\"; \n        git update-index --assume-unchanged \"$symlink\"; \n    done; \n    }; __git_rm_symlinks"
checkout-symlinks = "!__git_checkout_symlinks(){\n    POS=$'/'; DOS=$'\\\\\\\\'; \n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git update-index --no-assume-unchanged \"$symlink\"; \n        if [ -d \"$symlink\" ]; then \n            dossymlink=${symlink//$POS/$DOS}; \n            cmd //C rmdir //S //Q \"$dossymlink\"; \n        fi; \n        git  checkout -- \"$symlink\"; \n        echo \"Restored git symlink $symlink <<===>> `cat $symlink`\"; \n    done; \n    }; __git_checkout_symlinks"

这将为符号链接(symbolic link)创建一些 git 命令

注意:文件使用 Unix 行尾,请勿使用 Windows 记事本编辑!

然后执行命令

git rm --cached -r .
git reset --hard
git rm-symlinks

我在我的环境中测试过它,它可以工作

关于git - Vagrant - 摊铺机 devstack 错误 : "[Errno 20] Not a directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33561942/

相关文章:

visual-studio - 即使操作成功,PowerShell 也会在控制台中将一些 git 命令结果显示为错误

macos - Github推送失败

git - 是否无法将文件更改与 Visual Studio 2019 中的特定提交进行比较?

git - 撤消 Phabricator 中的最后一个差异

ubuntu - 在 virtualbox 客户机上运行 64 位 Ubuntu

chef-infra - vagrant-omnibus '11.10.0' 不是 Chef 的有效版本

java - 使用 Vagrant 时为 Chef 预缓存下载

ssh - Openstack/Nova : No route to host when I'm trying to ssh instance

openstack - 使用 ./stack.sh 安装 devtsack 在 devstack@etcd.service 失败

docker - 在 ubuntu14.04 docker 容器中安装 systemd - 这可能吗?