root账户下pull文件拥有者被修改问题
问题描述,个人开发经常在root账户下执行git pull,文件拥有者老是被改成root
# git pull
这种是会把修改、添加的文件都添加到root账户组下的。
1、查看执行文件所在的linux账号及分组,我的这里是 www:www
2、查看账号的是否可执行bash,在/etc/passwd
中查看
www:x:1001:1001::/home/www:/sbin/nologin
用户名:密码:用户ID:组ID:用户描述:家目录:登录Shell
/sbin/nologin
,代表是伪用户,没有登录和执行bash的权限,修改成下面
www:x:1001:1001::/home/www:/bin/bash
注意这里显示www的“根目录”是/home/www
3、使用如下命令
# sudo -H -u www bash -c '/usr/bin/git pull'
如果你配置的git登录方式时证书登录,还要将root下的证书复制一份到/home/www/.ssh
下执行
# cp ~/.ssh/id_rsa /home/www/.ssh/
# cp ~/.ssh/id_rsa.pub /home/www/.ssh/
# chown www:www /home/www/.ssh -R // 这个需要设置,否则文件还是root账户的
再次执行
# sudo -H -u www bash -c '/usr/bin/git pull'
这样拉去就不会被改变文件拥有者了。
4、为了方便下次拉取可以制作一个简单的shell脚本
touch git.sh chmod 711
写入内容:
#/bin/bash
sudo -H -u www bash -c '/usr/bin/git pull'
本地分支与远程分支关联
有时会碰到远程仓库的分支在自己本地不存在的情况,我们需要拉取远程分支在本地自动创建并关联:
git checkout -b ver1.0 origin/ver1.0
这样就不需要每次git pull
、git push
时带远程分支名了。
如果是本地一个分支在远程仓库不存在,我们需要把本地分支推送到远程并自动创建远程分支和建立关联:
git push -u origin tom:tom
关于 -u
看到一篇评论:
upstream不是针对远程仓库的,而是针对branch的。但是upstream和有几个远程库没有必然联系。
比如远程库A上有3个分支branch1、branch2、branch3。远程库B上有3个分支branchx、branchy、branchz。
本地仓库有2个分支local1和local2。那么当初始状态时,local1和local2和任何一个分支都没有关联,也就是没有upstream。
当通过git branch --set-upstream-to A/branch1 local1
命令执行后,会给local1和branch1两个分支建立关联,
也就是说local1的upstream指向的是branch1。这样的好处就是在local1分支上执行git push(git pull同理)操作时不用附加其它参数,
Git就会自动将local1分支上的内容push到branch1上去。同样,local2分支也可以和远程库A和远程库B上的任何一个分支建立关联,
只要给local2分支设置了upstream,就可以在local2分支上用git push(git pull同理)方便地与目标分支推拉数据。
综上所述,upstream与有几个远程库没有关系,它是分支与分支之间的流通道。
再来说说git push -u
和git branch --set-upstream-to
指令之间的区别。
举个例子:我要把本地分支mybranch1与远程仓库origin里的分支mybranch1建立关联。
两个途径:
git push -u origin mybranch1
git branch --set-upstream-to=origin/mybranch1 mybranch1
这两种方式都可以达到目的。
如果使用下列途径1的话,首先,你要切换到mybranch1分支上(git checkout mybranch1
)。
但是1方法更通用,因为你的远程库有可能并没有mybranch1分支,这种情况下你用2方法就不可行,
连目标分支都不存在,怎么进行关联呢?
所以可以总结一下:git push -u origin mybranch1
相当于
git push origin mybranch1 + git branch --set-upstream-to=origin/mybranch1 mybranch1
还有另一篇评论:
git push -u origin test
在指定完-u
之后,去到根目录的 .git/
目录下,找到config,可以看到下面有了branch "test"
的分支的记录:
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "test"]
remote = origin
merge = refs/heads/test
这样git才能知道当前test下的remote和merge的信息,如果你在git push
的时候没有带入-u
参数,
那么config中就不会有branch "test"
这一项。
git push -u
就是维护一条本地分支和远程分支之间的映射关系。
但是有没有想过这样添加
git push -u origin1 test
git push -u origin2 test
是什么结果,其实第2条语句会将第一条语句覆盖,实验证明对于一个本地分支只能建立到一个远程分支的跟踪关系(track branch),
就是在./git/config
文件里面只能维护一条记录,重复添加后面把前面的覆盖。
下次在test分支可以使用git push 直接提交(git 2.0后默认是simple模式),git从config里面自动找到映射关系, 不需要再写后面的远程仓库名 本地分支名和远程分支名了。
取消文件追踪
有时一些文件已经在git中追踪了,如何取消追踪呢?
// 删除readme.txt的跟踪,不过保留本地文件。
git rm --cached readme1.txt
// 删除readme.txt的跟踪,并且删除本地文件。
git rm --f readme.txt
// 删除test目录,并保留在本地。
git rm -r --cached test
然后在.gitignore
文件中写入不追踪的文件或目录。
更换项目的远程仓库
要修改一个Git项目的origin
库(即远程仓库的URL),你可以使用git remote
命令。以下是如何做到这一点的步骤:
1、查看当前远程仓库信息:
首先,你可以使用git remote -v
命令来查看当前项目配置的远程仓库信息。这将显示所有的远程仓库(通常至少有一个名为origin
)以及它们的URL。
git remote -v
输出可能类似于:
origin https://github.com/username/old-repo.git (fetch)
origin https://github.com/username/old-repo.git (push)
2、修改远程仓库的URL:
使用git remote set-url
命令来修改origin
远程仓库的URL。
git remote set-url origin <new_repository_url>
将<new_repository_url>
替换为你想要设置的新远程仓库的URL。
例如:
git remote set-url origin https://github.com/username/new-repo.git
3、再次验证远程仓库信息:
使用git remote -v
命令再次查看远程仓库信息,以确保你已经成功修改了URL。
git remote -v
输出现在应该显示新的URL:
origin https://github.com/username/new-repo.git (fetch)
origin https://github.com/username/new-repo.git (push)
4、推送或拉取:
现在你可以使用git push
或git pull
命令与新的远程仓库进行交互了。
请注意,如果你之前已经在旧的远程仓库中有提交,并且你想将这些提交推送到新的远程仓库,
你可能需要设置上游分支(使用git push -u origin <branch_name>
),或者在新仓库中创建一个与旧仓库相同的分支结构。
5、处理分支和提交:
如果你已经在新仓库中创建了与旧仓库相同的分支结构,并且想要推送特定的分支,你可以使用以下命令:
git push origin <branch_name>
如果你只是想推送所有分支和标签,可以使用:
git push --all origin
git push --tags origin
6、注意:
- 修改远程仓库URL只会影响你本地的Git配置。其他协作者仍然会指向旧的远程仓库,除非他们也执行了相同的操作。
- 在推送更改到新仓库之前,请确保你有权限向该仓库推送,并且该仓库是空的或者其结构与你的本地仓库相匹配,以避免合并冲突。
- 如果你之前已经配置了SSH密钥或其他身份验证机制来访问旧的远程仓库,并且新的仓库需要不同的凭据,你可能需要更新这些设置。
参考资料
root账户下git pull用户被修改问题 https://zhuanlan.zhihu.com/p/545197436
git push 的 -u 参数具体适合含义? https://www.zhihu.com/question/20019419
git取消文件或文件夹追踪 https://blog.csdn.net/white_rabbit_2/article/details/124984375