场景
在 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 init、git add、git commit、git 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 remoteset-urlorigin 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 mainGitLab 会自动创建main分支。
2. 提示 remote origin already exists 怎么办
说明已经存在名为origin的远程地址。
查看一下:
git remote-v如果要改成新的 GitLab 地址:
git remoteset-urlorigin git@gitlab.com:用户名/A.git3. 推送时提示 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.gitHTTPS 地址一般长这样:
https://gitlab.com/用户名/A.gitSSH 需要提前配置 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 remoteset-urlorigin git@gitlab.com:用户名/A.git git branch-M main git push-u origin main本地B已经有 Git,但想清空历史重新上传:
cd path\to\BRemove-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