将Git与Google Colab结合使用的方法


76

是否有推荐的方法将git与colab集成?

例如,是否可以从Google源代码库或类似代码中删除代码?

谷歌驱动器和云存储都不能用于git功能。

所以我想知道是否还有办法做到这一点?

Answers:


49

git安装在计算机上,您可以!用来调用Shell命令。

例如,要克隆git存储库:

!git clone https://github.com/fastai/courses.git

这是一个克隆存储库并加载存储在其中的Excel文件的完整示例。 https://colab.research.google.com/notebook#fileId=1v-yZk-W4YXOxLTLi7bekDw2ZWZXWW216


13
克隆私人存储库时,是否可以输入用户名和密码?
Abhai Kollara

6
如何将结果从Colab返回到github。我主要是
想让

2
在github上设置创建在开发选项卡令牌和使用:! git clone https://TOKEN@github.com/username/repository.git
弗拉基米尔·伊亚辛

46

如果要克隆私有存储库,最快的方法是:

!git clone https://username:password@github.com/username/repository.git


2
这接近重复另一个答案。但是欢迎。
qräbnö

2
有没有办法动态传递用户名和密码。使用变量?
Gowtham M

2
u = 'user0'; p = 'pass0'; !git clone https://$u:$p@github.com/$u/repository.git这应该工作,{p} {u}也要工作。(!!尽管应该开始新的一行。)
mikey

1
如果您@输入密码,请用替换%40
paradocslover

38

在Google colab中克隆私有github存储库的一种非常简单的方法如下。

  1. 您的密码不会被泄露
  2. 尽管您的密码包含特殊字符,但仍然可以使用
  3. 只需在Colab单元中运行以下代码段,它将以交互方式执行
import os
from getpass import getpass
import urllib

user = input('User name: ')
password = getpass('Password: ')
password = urllib.parse.quote(password) # your password is converted into url format
repo_name = input('Repo name: ')

cmd_string = 'git clone https://{0}:{1}@github.com/{0}/{2}.git'.format(user, password, repo_name)

os.system(cmd_string)
cmd_string, password = "", "" # removing the password from the variable

1
您说不会公开密码,但是如果可以访问由colab Notebook执行的bash语句,他们可以轻松找到密码,不是吗?并且,如果您假设没有人可以访问此类bash语句,那么其他方法究竟如何公开密码?
Ritwik

1
@Ritwik密码将不会保存在笔记本上
ohailolcat

15

为了保护您的帐户用户名和密码,可以getPass在shell命令中使用并连接它们:

from getpass import getpass
import os

user = getpass('BitBucket user')
password = getpass('BitBucket password')
os.environ['BITBUCKET_AUTH'] = user + ':' + password

!git clone https://$BITBUCKET_AUTH@bitbucket.org/{user}/repository.git

1
在纯文本密码显示在日志/输出中的意义上,这种保护确实很弱。
西蒙(Simon)

1
@Simon仅在由于出现错误而无法克隆存储库时才显示密码。
nbro

在我的情况下,由于,我收到了400(错误的请求){user},它没有转换为实际的用户名。
nbro

11

您可以使用ssh协议将专用存储库与colab连接

  1. 在您的本地计算机上生成ssh密钥对,不要忘了将
    短语保留为空,请查看本教程

  2. 上载到colab,查看以下截图

    from google.colab import files
    uploaded = files.upload()

  3. 将ssh kay对移动到/ root并连接到git

    • 删除以前的ssh文件
      ! rm -rf /root/.ssh/*
      ! mkdir /root/.ssh
    • 解压缩ssh文件
      ! tar -xvzf ssh.tar.gz
    • 复制到根目录
      ! cp ssh/* /root/.ssh && rm -rf ssh && rm -rf ssh.tar.gz ! chmod 700 /root/.ssh
    • 添加您的git服务器,例如gitlab作为ssh已知主机
      ! ssh-keyscan gitlab.com >> /root/.ssh/known_hosts
      ! chmod 644 /root/.ssh/known_hosts
    • 设置你的git帐户
      ! git config --global user.email "email"
      ! git config --global user.name "username"
    • 最终连接到您的git服务器
      ! ssh git@gitlab.com
  4. 验证您的私有存储库,请检查此每个存储库部署密钥

  5. ! git@gitlab.com:{account}/{projectName}.git
    注意:要使用push,您必须授予对
    git服务器进行身份验证的公共ssh密钥的写入权限。



6

您几乎可以使用此链接:https : //qiita.com/Rowing0914/items/51a770925653c7c528f9

作为上述链接的摘要,您应该执行以下步骤:

1-使用以下命令将您的Google colab运行时连接到您的Google云端硬盘:

from google.colab import drive
drive.mount('/content/drive')

这将需要身份验证过程。做任何需要的事情。

2current directory要在此处克隆Git项目的路径:

在我的示例中:

path_clone = "drive/My Drive/projects"
!cd path_clone

不要忘记!cd命令开头使用。

3-克隆Git项目:

!git clone <Git project URL address>

现在您将projects在Google云端硬盘(也已连接到您的Google Colab运行时计算机)的文件夹中拥有克隆的Git项目。

4-转到您的Google云端硬盘(使用浏览器或其他工具),然后转到“项目”文件夹,然后打开.ipynb要在Google Colab中使用的文件。

5-现在您有了.ipynb要使用的Google Colab运行时,它也已连接到Google云端硬盘,并且所有克隆的git文件都在Colab运行时的存储中。

注意:

1-检查您的Colab运行时是否已连接到Google云端硬盘。如果未连接,请重复上述步骤1

2-通过使用“ pwd”和“ cd”命令current directory再次检查与google Drive中克隆的git项目相关的步骤(上面的步骤2)


4

使用git与github或gitlab同步colab的三个步骤。

  1. 生成私钥-公钥对。将私钥复制到系统clibboard以便在步骤2中使用。视情况将公钥粘贴到github或gitlab。

    在Linux中,可以使用ssh-keygen在〜/ .ssh中生成密钥对。生成的私钥在文件id_rsa中,公钥在文件id_rsa.pub中。

  2. 在Colab中,执行

    key = \
    '''
    paste the private key here 
    (your id_rsa or id_ecdsa file in the .ssh directory, e.g.
    -----BEGIN EC PRIVATE KEY-----
    M..............................................................9
    ...............................................................J
    ..................................==
    -----END EC PRIVATE KEY-----
    '''
    ! mkdir -p /root/.ssh
    with open(r'/root/.ssh/id_rsa', 'w', encoding='utf8') as fh:
        fh.write(key)
    ! chmod 600 /root/.ssh/id_rsa
    ! ssh-keyscan github.com >> /root/.ssh/known_hosts 
    # test setup
    ! ssh -T git@github.com
    # if you see something like "Hi ffreemt! You've successfully 
    # authenticated, but GitHub does not provide shell access."
    # you are all set. You can tweak .ssh/config for multiple github accounts
    
  3. 像往常一样使用git拉/推。

只需稍作更改,即可在colab和HostA之间将rsync(或ssh)用于相同的想法:

  1. 生成私钥-公钥对。将私钥复制到系统clibboard中,以在步骤2中使用。将公钥粘贴到HostA中.ssh中的authorized_keys中。

  2. 在Colab中,执行

    key = \
    '''
    paste the private key here
    '''
    ! mkdir -p /root/.ssh
    with open(r'/root/.ssh/id_rsa', 'w', encoding='utf8') as fh:
        fh.write(key)
    ! chmod 600 /root/.ssh/id_rsa
    ! ssh -oStrictHostKeyChecking=no root@HostA hostnam  # ssh-keyscan 
    

HostA >> /root/.ssh/known_hosts似乎不适用于IP。

  1. 照常使用rsync同步colab和HostA之间的文件。

3

解决方案https://stackoverflow.com/a/53094151/3924118对我不起作用,因为表达式{user}未转换为实际的用户名(我收到了400个错误的请求),因此我将该解决方案略微更改为以下内容一。

from getpass import getpass
import os

os.environ['USER'] = input('Enter the username of your Github account: ')
os.environ['PASSWORD'] = getpass('Enter the password of your Github account: ')
os.environ['REPOSITORY'] = input('Enter the name of the Github repository: ')
os.environ['GITHUB_AUTH'] = os.environ['USER'] + ':' + os.environ['PASSWORD']

!rm -rf $REPOSITORY # To remove the previous clone of the Github repository
!git clone https://$GITHUB_AUTH@github.com/$USER/$REPOSITORY.git

os.environ['USER'] = os.environ['PASSWORD'] = os.environ['REPOSITORY'] = os.environ['GITHUB_AUTH'] = ""

如果能够克隆your-repo,则在此命令的输出中应该看不到任何密码。如果出现错误,密码可能会显示在输出中,因此请确保在此命令失败时不要共享笔记本。


2

我在这里尝试了一些方法,它们都运行良好,但是我面临的一个问题是,在笔记本单元中处理所有git命令和其他相关命令(例如使用DVC进行版本控制)变得很困难。因此,我转向了这个不错的解决方案,Kora。它是可以在colab中运行的终端仿真器。这使易用性与本地计算机中的终端非常相似。笔记本仍将保留,我们可以照常编辑文件和单元格。由于此控制台是临时的,因此不会公开任何信息。GitHub登录和其他命令可以照常运行。

Kora:https//pypi.org/project/kora/

用法:

!pip install kora
from kora import console
console.start()

0

使用以下方法安装驱动器:

from google.colab import drive
drive.mount('/content/drive/')

然后:

%cd /content/drive/

在驱动器中克隆存储库

!git clone <github repo url> 

从仓库中访问其他文件(例如:helper.py是仓库中的另一个文件):

import imp 
helper = imp.new_module('helper')
exec(open("drive/path/to/helper.py").read(), helper.__dict__)

2
致命:无法创建工作树目录“示例”:不支持该操作
vinsent paramanantham

0

如果您想共享您的存储库和协作库,则此方法有效。如果您有多个存储库,则也可以使用。只需将其放入一个单元格即可。

import ipywidgets as widgets
from IPython.display import display
import subprocess

class credentials_input():
    def __init__(self, repo_name):
        self.repo_name = repo_name
        self.username = widgets.Text(description='Username', value='')
        self.pwd = widgets.Password(description = 'Password', placeholder='password here')

        self.username.on_submit(self.handle_submit_username)
        self.pwd.on_submit(self.handle_submit_pwd)        
        display(self.username)

    def handle_submit_username(self, text):
        display(self.pwd)
        return

    def handle_submit_pwd(self, text):
        cmd = f'git clone https://{self.username.value}:{self.pwd.value}@{self.repo_name}'
        process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
        output, error = process.communicate()
        print(output, error)
        self.username.value, self.pwd.value = '', ''

get_creds = credentials_input('github.com/username/reponame.git')
get_creds

0

将私人仓库克隆到Google colab:

生成令牌:

Settings -> Developer settings -> Personal access tokens -> Generate new token

复制令牌并克隆存储库(相应地替换用户名令牌

!git clone https://username:token@github.com/username/repo_name.git

0

我终于把自己拉起来,为此写了一个python包。

pip install clmutils  # colab-misc-utils

在/ content / drive / MyDrive(如果将Google驱动器安装到驱动器)或/content/drive/.env中,在/ content / drive / MyDrive中创建dotenv或.env

# for git 
user_email = "your-email"
user_name = "your-github-name"
gh_key = "-----BEGIN EC PRIVATE KEY-----
...............................................................9
your github private key........................................J
..................................==
-----END EC PRIVATE KEY-----
"

在Colab单元中

from clmutils import setup_git, Settings

config = Settings()
setup_git(
    user_name=config.user_name,
    user_email=config.user_email,
    priv_key=config.gh_key
)

然后,您将被设置为执行所有git cloen,修改代码之类的git push事情,就像在家里或工作中自己的漂亮计算机上一样。

clmutils也有一个功能,称为setup_ssh_tunnel建立到Colab的反向ssh隧道。它还从.env文件中读取各种密钥,用户名和主机名。这有点涉及。但是,如果您知道如何手动建立到Colab的反向ssh隧道,那么弄清楚它们的用途将没有问题。有关详细信息,请访问github repo(google clmutils pypi)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.