场景

在 GitLab 上新建了一个项目,比如项目名叫 A

这个项目刚创建时什么都没有,也没有 main 分支。现在本地有一个文件夹 B,想把 B 里的所有内容上传到 GitLab 项目 A,并且希望上传后 GitLab 项目根目录下直接是 B 里的文件,而不是多一层 B 文件夹。

也就是说,希望 GitLab 上是这样:

A/
  文件1
  文件夹1/
  package.json
  README.md

而不是这样:

A/
  B/
    文件1
    文件夹1/
    package.json
    README.md

核心结论

Git 上传的是“当前 Git 仓库根目录里的内容”,不是自动上传外层文件夹名。

如果想让 GitLab 项目 A 的根目录直接显示 B 里的内容,就要进入 B 文件夹内部执行 Git 命令。

关键点是:

cd path\to\B

然后再执行 git initgit addgit commitgit push

只要是在 B 目录里面操作,上传到 GitLab 后就不会多出一层 B 文件夹。

情况一:B 里还没有 Git

进入本地文件夹 B

cd path\to\B

初始化 Git 仓库:

git init

把当前分支改名为 main

git branch -M main

添加 GitLab 项目 A 的远程地址:

git remote add origin git@gitlab.com:用户名/A.git

如果你用的是 HTTPS 地址,也可以写成:

git remote add origin https://gitlab.com/用户名/A.git

添加所有文件:

git add .

提交:

git commit -m "Initial commit"

推送到 GitLab 的 main 分支:

git push -u origin main

完成后,GitLab 项目 A 下直接就是 B 里的内容。

情况二:B 里已经有 Git

如果 B 文件夹里已经有 .git,说明它本身已经是一个 Git 仓库。

先进入 B

cd path\to\B

查看当前远程地址:

git remote -v

如果没有远程地址,可以添加 GitLab 项目 A

git remote add origin git@gitlab.com:用户名/A.git

如果已经有旧的远程地址,但现在想改成 GitLab 项目 A

git remote set-url origin git@gitlab.com:用户名/A.git

把当前分支改成 main

git branch -M main

推送:

git push -u origin main

这种做法会保留原来的 Git 提交历史。

情况三:B 里有 Git,但不想保留历史

如果 B 里已经有 .git,但你不想要旧的提交历史,只想把当前文件作为一个全新的项目上传,可以删除 .git 后重新初始化。

先进入 B

cd path\to\B

删除原来的 Git 仓库信息:

Remove-Item -Recurse -Force .git

然后重新初始化:

git init
git branch -M main
git remote add origin git@gitlab.com:用户名/A.git
git add .
git commit -m "Initial commit"
git push -u origin main

注意:删除 .git 会丢掉本地 Git 历史、分支、提交记录,只保留当前文件内容。

为什么不会上传成 A/B

假设本地目录是:

D:\code\B
  index.html
  src\
  README.md

如果你这样操作:

cd D:\code\B
git add .

Git 管理的是 B 目录里面的内容,所以 GitLab 上会是:

A/
  index.html
  src/
  README.md

如果你在 B 的上一级目录操作:

cd D:\code
git add B

那 Git 管理的就是 B 这个文件夹本身,所以 GitLab 上可能会变成:

A/
  B/
    index.html
    src/
    README.md

所以关键区别就是:要进入 B 里面再执行 Git 命令。

常见问题

1. GitLab 项目没有 main 分支怎么办

空项目没有分支是正常的。

第一次推送时执行:

git branch -M main
git push -u origin main

GitLab 会自动创建 main 分支。

2. 提示 remote origin already exists 怎么办

说明已经存在名为 origin 的远程地址。

查看一下:

git remote -v

如果要改成新的 GitLab 地址:

git remote set-url origin git@gitlab.com:用户名/A.git

3. 推送时提示 rejected 怎么办

如果 GitLab 远程项目不是完全空的,可能会出现 rejected。

可以先拉取远程内容再推送:

git pull origin main --allow-unrelated-histories
git push -u origin main

如果你确定远程内容不需要,也可以强制推送:

git push -u origin main --force

强制推送会覆盖远程分支历史,使用前要确认远程没有重要内容。

4. SSH 和 HTTPS 地址有什么区别

SSH 地址一般长这样:

git@gitlab.com:用户名/A.git

HTTPS 地址一般长这样:

https://gitlab.com/用户名/A.git

SSH 需要提前配置 SSH Key,但以后推送比较方便。

HTTPS 通常需要输入账号、密码或访问令牌。

最常用命令总结

本地 B 没有 Git,上传到空 GitLab 项目 A

cd path\to\B
git init
git branch -M main
git remote add origin git@gitlab.com:用户名/A.git
git add .
git commit -m "Initial commit"
git push -u origin main

本地 B 已经有 Git,只是改远程地址:

cd path\to\B
git remote set-url origin git@gitlab.com:用户名/A.git
git branch -M main
git push -u origin main

本地 B 已经有 Git,但想清空历史重新上传:

cd path\to\B
Remove-Item -Recurse -Force .git
git init
git branch -M main
git remote add origin git@gitlab.com:用户名/A.git
git add .
git commit -m "Initial commit"
git push -u origin main
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐