Git 多用户配置
一、引言 一般来说,安装好 git 后,我们都会配置一个全局的 config 信息,就像这样:
1 2 |
git config --global user.name "jitwxs" // 配置全局用户名,如 Github 上注册的用户名 git config --global user.email "jitwxs@foxmail.com" // 配置全局邮箱,如 Github 上配置的邮箱 |
但是你可能会碰到需要在一台电脑上配置多个用户信息的需求。此时就不能够用一个全局配置搞定一切了。 比如因为我的个人电脑出了问题,我想要提交我的个人项目时,只能用公司配的电脑去提交。而公司的电脑配置的是私有的 gitlab 仓库,而我自己的项目存储在 github 上。这两个仓库不仅仓库地址不一样,仓库的用户名和邮箱都不一样。 二、配置多用户 本文将配置分别是 github 以及 gitlab 上的两个用户,并分别在它们所属的项目上进行 git 操作,这差不多就是配置多用户的大部分操作了。 GITHUB GITLAB 用户名 jitwxs lemon 邮箱 jitwxs@foxmail.com lemon@test.com 2.1 清除全局配置 在正式配置之前,我们先得把全局配置给清除掉(如果你配置过的话),执行命令:
1 |
git config --global --list |
这会列出所有已经配置的全局配置,如果你发现其中有 user.name 和 user.email 信息,请执行以下命令将其清除掉:
1 2 |
git config --global --unset user.name git config --global --unset user.email |
2.2 生成钥对 钥对的保存位置默认在 ~/.ssh 目录下,我们先清理下这个目录中已存在的钥对信息,即删除其中的 id_rsa、id_rsa.pub 之类的公钥和密钥文件。 首先我们开始生成 github 上的仓库钥对,通过 -C 参数填写 github 的邮箱:
1 |
ssh-keygen -t rsa -C “jitwxs@foxmail.com” |
按下 ENTER 键后,会有如下提示:
1 |
Generatingpublic/privatersa key pair.Enter fileinwhich to save the key (/Users/jitwxs/.ssh/id_rsa): |
在这里输入公钥的名字,默认情况是叫 id_rsa,为了和后面的 gitlab 配置区分,这里输入 id_rsa_github。输入完毕后,一路回车,钥对就生成完毕了。 下面开始生成 gitlab 上的仓库钥对,步骤和上面一样:
1 |
ssh-keygen -t rsa -C “lemon@test.com” |
生成的公钥名就叫做:id_rsa_gitlab。 2.3 添加 SSH Keys 我相信你既然都看到这篇文章了,你一定掌握了如何将公钥添加到 SSH Keys 中。请将 id_rsa_github.pub 和 id_rsa_gitlab.pub 内容分别添加到 github 和 gitlab 的 SSH Keys 中,这里就不啰嗦了。 2.4 添加私钥 在上一步中,我们已经将公钥添加到了 github 或者 gitlab 服务器上,我们还需要将私钥添加到本地中,不然无法使用。添加命令也十分简单,如下:
1 2 |
ssh-add ~/.ssh/id_rsa_github // 将 GitHub 私钥添加到本地 ssh-add ~/.ssh/id_rsa_gitlab // 将 GitLab 私钥添加到本地 |
添加完毕后,可以通过执行 ssh-add -l 验证下,如果都能显示出来和下面一样,就 […]
View Detailsgit多账号配置,同时使用多个代码托管平台
我们在使用git管理代码的时候,经常需要放到不同的托管网站,如github,osc等,那么不同的网站账号不一样,就需要生成不同密钥,配置对应的不同网站,接下来我们写写如何处理。 ps:这里是在centos7.2下操作,不过其他操作系统依然适用,这里举的例子,一个是github,一个是osc。 1 生成密钥 这里可以设置密钥文件名和路径,/root/.ssh 是路径(一般路径选择默认),id_rsa_github是密钥文件名, 文件命名后按两次回车,即密码为空
1 |
ssh-keygen -T rsa -C "example@qq.com" |
生成github的密钥 生成osc的密钥 查看一下.ssh文件夹,发现有id_rsa_github, id_rsa_github.pub(放到github),id_rsa_osc, id_rsa_osc.pub(放到osc)
1 |
ls -a /root/.ssh |
2 接下来配置多账号 在.ssh文件夹下面新建一个命名为config的文件,编辑如下内容
1 2 3 4 5 6 7 8 9 10 11 |
#github Host github.com HostName github.com IdentityFile ~/.ssh/id_rsa_github User pinnuli #osc Host gitee.com HostName gitee.com IdentityFile ~/.ssh/id_rsa_osc User pinnuli |
(/images/git_multiaccount_config.png) 3 把对应的公钥放到github和osc上面 4 测试是否成功
1 |
ssh -T git@github.com |
1 |
ssh -T git@gitee.com |
至此,git多账号配置完毕,需要更多账号也是一样的道理 from:https://blog.csdn.net/pinnuli/article/details/81293071
View Details【Git】删除某个全局配置项
1.查看Git所有配置 git config --list 2.删除全局配置项 (1)终端执行命令: git config --global --unset user.name (2)编辑配置文件: git config --global --edit from:https://www.cnblogs.com/zqunor/p/9055262.html
View DetailsGit:gitlab修改域名配置
sudo gitlab-ctl stop 修改/etc/gitlab/gitlab.rb中的如下一行:
1 |
external_url 'http://gitlab.xxxxx.cn' |
执行更新配置操作 sudo gitlab-ctl reconfigure sudo gitlab-ctl start from:https://blog.csdn.net/qq_36937234/article/details/89381857
View DetailsLinux ssh-add命令
ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中。该命令位置在/usr/bin/ssh-add。 来自: http://man.linuxde.net/ssh-add 语法: ssh-add [-cDdLlXx] [-t life] [file …] ssh-add -s pkcs11 ssh-add -e pkcs11 选项 -D:删除ssh-agent中的所有密钥. -d:从ssh-agent中的删除密钥 -e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙。 -s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙。 -L:显示ssh-agent中的公钥 -l:显示ssh-agent中的密钥 -t life:对加载的密钥设置超时时间,超时ssh-agent将自动卸载密钥 -X:对ssh-agent进行解锁 -x:对ssh-agent进行加锁 from:https://blog.csdn.net/feifei3851/article/details/81113267
View Detailsgit 删除历史commit
“没有commit错代码的人,不足以称为高级工程师。——凯天” 你不认识凯天没事,你只用知道代码提交错分支有救就行了。废话不多说,我们进入正题——怎么删除最后一次提交的记录。 删除最后一次提交 命令很简单,但是不能马虎,不能多回滚或者少回滚,不然就麻烦不断了。 主要命令: 第一步:回滚上一次提交 git reset --hard HEAD^ 就很简单,回滚master分支的上一次提交。 第二步:强制提交本地代码 git push origin master -f 由于本地reset 之后本地库落后于远程N个版本,所以需要强制提交。 路上可能遇到的坑: 提交的过程中,有可能没那么顺利。比如提示error: pre-receive hook declined …. 为什么最后强制提交会失效,原因:分支被保护了,无法强制提交。 不着急,不要慌。我们记录距离支成功回滚代码只差最后一步了——解除branch 保护。怎么玩?很简单,进入gitLab。然后找到Settings(需要账户具备该权限),然后找到Protected branches,然后点击Unprotect按钮。(如图) 强制提交错误 解除保护后,再尝试使用强制提交的命令即可。 最后,大功告成。 删除指定commit提交 如果只能删除最后一次提交记录,多少还是有点鸡肋。有时候我们需要删除的可能是中间的两条commit 记录。其实玩法大同小异。 首先我们确认需要删除的commit log id 是多少,比如:我们需要删除的是:21a254a2b7 对应的这条log。 删除前.png 然后使用git rebase 命令,命令的意思是可以改写从 21a254a2b7 commit id 开始后的所有提交记录。 git rebase -i 21a254a2b7^ 执行完这个命令后,就可以看到 21a254a2b7 后的所有commit 记录了。 默认是使用vim 编辑器打开了commit log list。然后我们就可以针对我们不需要的某些log 进行删除了。把原本的pick 单词修改为drop 就表示该commit log 我们需要删除。如下图 修改删除记录.png 并且图片中还有对应的说明解释。 分支删除完成后,保存该文件并退出vim 编辑器。 最后,使用强制更新的命令: git push origin master -f 如果出现“pre-receive hook declined ….”,处理方式参看上面的方案。 全程命令: 删除成功.png 最后删除成功,我们对比下删除前后的log记录。 删除后.png 参考博客: https://blog.csdn.net/QQxiaoqiang1573/article/details/68074847 https://www.cnblogs.com/cppeterpan/p/7289266.html 作者:凯天 链接:https://www.jianshu.com/p/335e5ac0a823 […]
View DetailsShell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
1 |
echo string |
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
1 |
echo "It is a test" |
这里的双引号完全可以省略,以下命令与上面实例效果一致:
1 |
echo It is a test |
2.显示转义字符
1 |
echo "\"It is a test\"" |
结果将是:
1 |
"It is a test" |
同样,双引号也可以省略 3.显示变量 read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
1 2 3 |
#!/bin/sh read name echo "$name It is a test" |
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
1 2 3 |
[root@www ~]# sh test.sh OK #标准输入 OK It is a test #输出 |
4.显示换行
1 2 |
echo -e "OK! \n" # -e 开启转义 echo "It is a test" |
输出结果:
1 2 3 |
OK! It is a test |
5.显示不换行
1 2 3 |
#!/bin/sh echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test" |
输出结果:
1 |
OK! It is a test |
6.显示结果定向至文件
1 |
echo "It is a test" > myfile |
7.原样输出字符串,不进行转义或取变量(用单引号)
1 |
echo '$name\"' |
输出结果:
1 |
$name\" |
8.显示命令执行结果
1 |
echo `date` |
注意: 这里使用的是反引号 `, 而不是单引号 '。 结果将显示当前日期
1 |
Thu Jul 24 10:08:46 CST 2014 |
from:https://www.runoob.com/linux/linux-shell-echo.html
View DetailsLinux touch命令
Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。 ls -l 可以显示档案的时间记录。 语法
1 |
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…] |
参数说明: a 改变档案的读取时间记录。 m 改变档案的修改时间记录。 c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。 f 不使用,是为了与其他 unix 系统的相容性而保留。 r 使用参考档的时间记录,与 --file 的效果一样。 d 设定时间与日期,可以使用各种不同的格式。 t 设定档案的时间记录,格式与 date 指令相同。 --no-create 不会建立新档案。 --help 列出指令格式。 --version 列出版本讯息。 实例 使用指令"touch"修改文件"testfile"的时间属性为当前系统时间,输入如下命令:
1 |
$ touch testfile #修改文件的时间属性 |
首先,使用ls命令查看testfile文件的属性,如下所示:
1 2 3 |
$ ls -l testfile #查看文件的时间属性 #原来文件的修改时间为16:09 -rw-r--r-- 1 hdd hdd 55 2011-08-22 16:09 testfile |
执行指令"touch"修改文件属性以后,并再次查看该文件的时间属性,如下所示:
1 2 3 4 |
$ touch testfile #修改文件时间属性为当前系统时间 $ ls -l testfile #查看文件的时间属性 #修改后文件的时间属性为当前系统时间 -rw-r--r-- 1 hdd hdd 55 2011-08-22 19:53 testfile |
使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
1 |
$ touch file #创建一个名为“file”的新的空白文件 |
from:https://www.runoob.com/linux/linux-comm-touch.html
View Detailsaxios全局设置url公共请求头
需求由来: 公司项目外链到别公司项目或者网页(通俗的说就是通过别的随意网页跳转至你项目网页),这时公司项目就要区分是从哪个公司或者哪个网页跳转过来的,从而进行不同的接口请求(公司所有接口都要带上请求头)。大部分做法都是设置请求头来区分。做法如下: 废话不多说 直接上代码 通俗易懂: 新建一个配置文件requst.js 内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import axios from 'axios'; // 设置公共请求头 const init = function () { let url = window.location.search.toString() // 获取外链过来的连接参数部分 let arr = [] let obj = {} // 预封装集合 arr = url.split('&') // 对参数切割处理 在封装 arr.forEach(l => { l = l.split('=') obj[l[0]] = l[1] }) // 具体有哪些参数看你们后台定义了哪些 下面的参数有 osType、deviceId、deviceChannel、language ..... axios.defaults.headers.common['deviceChannel'] = 'gclife_bmp_pc'; axios.defaults.headers.common['language'] = window.localStorage.defaultLanguage; // 有则赋值 obj.osType ? axios.defaults.headers.common['osType'] = obj.osType : axios.defaults.headers.common['osType'] = ''; obj.deviceId ? axios.defaults.headers.common['deviceId'] = obj.deviceId : axios.defaults.headers.common['deviceId'] = ''; . . . } export default { init } |
接下来就是在main.js引入就行了 如下:
1 2 3 |
// 引入请求头文件 import request from './request' request.init() // 请求头初始化 |
上诉内容就是设置公共请求头的内容了。 from:https://www.cnblogs.com/ljx20180807/p/9766699.html
View DetailsVue 子组件与父组件之间的 双向数据绑定
方法一(常规) 父组件传递数据到子组件; 子组件将数据转成本地数据
1 2 3 4 5 6 |
props: ['name'], data() { return { iName: this.name } }, |
但是此时,父组件如果更新了name 值,但是子组件中的 iName 不会随之更改;所以要监听父组件传入数据的变化,随之更新子组件;
1 2 3 4 5 6 |
watch: { // 监听父组件传入的数据,更新到本地 name(newVal, oldVal){ this.iName = newVal; } }, |
此时,父组件更新 name ,子组件展示出来的数据(iName)会随之变化,但是子组件修改数据,父组件不会变化,所以需要监听子组件数据(iName)的变化,通知父组件进行更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 子组件中的监听 watch: { // 监听父组件传入的数据,更新到本地 name(newVal, oldVal){ this.iName = newVal; }, // 监听本地数据的变化,通知父组件更新 iName(newVal, oldVal) { this.$emit('update', newVal); } }, // 父组件中的更新 <test :name="name" @update="update"/> methods: { update(str) { this.name = str; } }, |
方法二(自定义 v-model 双向数据绑定) 自定义组件中使用 v-model 进行双向数据绑定,相当于;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<test v-model="selected" /> 相当于 <test :value="selected" @input="data=> selected=data"/> 所以子组件需要做的事情就是 1. 接收 value 数据 props: ['value'], 2. 将value 转成本地数据 data() { return { checked: this.value } }, 3. 监听 value 的变化,更新到本地数据, 监听 本地数据的变化,使用 input 事件通知父组件更新 watch: { value(newVal){ this.checked = newVal; }, checked(newVal){ this.$emit('input', newVal) } }, |
方法三(.sync 修饰符)
1 |
<input :title.sync="xx"/> |
拆开后
1 |
<input @update:title="data => xx=data" :title="xx"/> |
from:https://blog.csdn.net/qq_39125684/article/details/90380268
View Details