Git 使用整理


Git 使用整理


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 pullgit 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 -ugit branch --set-upstream-to指令之间的区别。

举个例子:我要把本地分支mybranch1与远程仓库origin里的分支mybranch1建立关联。

两个途径:

  1. git push -u origin mybranch1
  2. 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 pushgit 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


返回