我正在编写一个bash脚本,可以从我已经创建的GitHub模板初始化一个新的存储库。我希望脚本能够复制这个GitHub帮助文档中列出的步骤,但我无法弄清楚如何从命令行使用GitHub模板。

我在WSL2上使用Ubuntu 18.04。我已经定义了一个function project()(见下文),它接受一个输入(新项目的名称),并且应该执行以下操作:

  1. cd到我的主目录
  2. 调用python脚本create_project.py,在本地创建新项目的文件夹,并在GitHub上创建远程仓库
  3. cd到新项目的本地目录
  4. 从我的模板初始化一个repo
  5. 连接到GitHub上的远程仓库(在步骤2中制作)
  6. 承诺
#!/bin/bash
function project() {
    cd /home/levicrews
    python3 create_project.py $1
    cd /home/levicrews/$1
    git init --template=</home/levicrews/template-project>
    git remote add origin [email protected]:levicrews/$1.git
    git add .
    git commit -m "Initial commit"
    git push -u origin master
}
import sys
import os
from github import Github

path = "/home/levicrews/"

username = "" #Insert your github username here
password = "" #Insert your github password here

def create_project():
    folderName = str(sys.argv[1])
    os.makedirs(path + str(sys.argv[1]))
    user = Github(username, password).get_user()
    repo = user.create_repo(sys.argv[1])
    print("Succesfully created repository {}".format(sys.argv[1]))

if __name__ == "__main__":
    create_project()

不幸的是,我的所有模板文件最终都在新repo的/.git目录中(从读取git init上的文档,我现在意识到这是--template标志的预期行为)。我可以对我的脚本进行哪些更改以从GitHub复制"Use this template"行为?

分析解答

如果template-project不是git存储库,您可以在init之前复制它:

#!/bin/bash
function project() {
    cd /home/levicrews
    cp -a /home/levicrews/template-project $1
    python3 create_project.py $1
    cd /home/levicrews/$1
    git init
    git remote add origin [email protected]:levicrews/$1.git
    git add .
    git commit -m "Initial commit"
    git push -u origin master
}

如果template-project已经有.git目录,则需要将其删除:

#!/bin/bash
function project() {
    cd /home/levicrews
    cp -a /home/levicrews/template-project $1
    rm $1/.git
    python3 create_project.py $1
    cd /home/levicrews/$1
    git init
    git remote add origin [email protected]:levicrews/$1.git
    git add .
    git commit -m "Initial commit"
    git push -u origin master
}

如果git历史记录很大,则复制到.git并再次删除.git文件夹将效率低下。您可以使用以下hack:

git archive --format=tar --remote=/home/levicrews/template-project master | tar xf -