6

我有 Arch Linux Python 3.3.0 我已经下载了最新的 repo,如果我尝试从 Google 示例中执行 repo init,我会收到以下错误:

 [username@otp-username-l2 teste]$ repo init -u https://android.googlesource.com/platform/manifest
 Traceback (most recent call last):
 File "/home/username/bin/repo", line 738, in <module>
main(sys.argv[1:])
File "/home/username/bin/repo", line 705, in main
_Init(args)
 File "/home/username/bin/repo", line 234, in _Init
_CheckGitVersion()
 File "/home/username/bin/repo", line 274, in _CheckGitVersion
if not ver_str.startswith('git version '):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

我被迫做一个新的 repo init 的原因是我必须从一个已经初始化的 repo 进行提交,但是我已经从任何地方更改了 git 用户,我仍然得到这个:

Writing objects: 100% (12/12), 966 bytes, done.
Total 12 (delta 11), reused 0 (delta 0)
o ssh://new.username@128.224.0.74:29418/stelvio/mm
![remote rejected] branchname -> refs/for/main_dev (you are not committer  oldusername@email.com)
 error: failed to push some refs to 'ssh://new.username@128.224.0.74:29418/project/one'
4

3 回答 3

9

Repo 尚未完全支持 Python 3。一些工作已经完成,例如使用该print函数导入正确的 urllib,但这项工作似乎还没有完成。

现在,您需要在 Python 2 中使用它。您可以repo通过替换来编辑可执行文件顶部的 shebang pythonpython2或者您可以运行:

python2 `which repo`

假设您在路径中安装了 Python 2 版本,即python2.

您可以轻松地重现该问题:

Python 3.2.3 (default, Nov  7 2012, 19:36:04) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> b'asd'.startswith('asd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

这是相关的代码_CheckGitVersion()

def _CheckGitVersion():
  cmd = [GIT, '--version']
  try:
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)

   ...

  ver_str = proc.stdout.read().strip()
  proc.stdout.close()
  proc.wait()

  if not ver_str.startswith('git version '):

read调用的返回,因此传递给stdout的内容也必须是(原始数据字节)而不是(一系列 Unicode 代码点)。Popenbytesstartswithbytesstr

于 2013-04-09T23:39:15.463 回答
7

在尝试恢复我的 P990 时偶然发现了这个错误。

第一个修复是修改 repo 命令(在你的情况下在 ~/bin 中,否则检查哪个 repo 找到它在哪里)并将第一行从

#!/usr/bin/env python

#!/usr/bin/env python2

这允许您 repo init,但您会遇到 klauspeter 提到的消息:

error: Python 3 support is not fully implemented in repo yet.
Please use Python 2.6 - 2.7 instead.

我不建议更改系统范围的符号链接。相反,导航到新创建的 .repo 文件夹。

如果您在 $basedir 中启动 repo init,您需要检查 $basedir/.repo/repo。在里面你会发现一个本地 repo 安装,同样有一个带有普通“python”的 shebang(我们想要 python2)。

因此,根据上述第一步编辑包含该行的所有文件(main.py、repo 和 wrapper.py ),一切顺利。对我来说,repo 现在甚至要求我更新我的全局安装(即,将 $basedir/.repo/repo/repo 复制到 ~/bin),您可以随意执行此操作(该版本现在已“修复”)。

于 2013-10-11T09:12:49.543 回答
1

我遇到了同样的问题,agf 的解决方案使 repo-script 工作,但它仍然退出说明它不适用于 python 3:

错误:Python 3 支持尚未在 repo 中完全实现。
请改用 Python 2.6 - 2.7。

对我来说,解决这个问题的(诚然相当肮脏)的方法是将 python bin 的符号链接从 python3 更改为 python2。

完成后请记住将其还原!

于 2013-10-02T17:19:41.103 回答