所有由zhufenghua发布的文章

git pull 命令从远程拉取代码

git pull 命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。

语法:

git pull [options] [<repository> [<refspec>…]]

将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。
更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用–rebase,它运行git rebase而不是git merge。

例子:

$ git pull <远程主机名> <远程分支名>:<本地分支名>

比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样

$ git pull origin next:master

如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:

$ git pull origin next

上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge。

$ git fetch origin
$ git merge origin/next

上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge。

$ git fetch origin
$ git merge origin/next

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。


Git也允许手动建立追踪关系。

$ git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。


如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

$ git pull origin

上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。

如果当前分支只有一个追踪分支,连远程主机名都可以省略。

$ git pull

上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

git 查看分支,切换分支

查看所有分支:

git branch -a

切换到某个分支上,例如切换到 origin 的 main 分支上

git checkout origin/main

不过需要注意,直接 git checkout 是一个危险的操作,它会重写工作区,如果你的工作区有文件还未提交,则会丢失。

如果希望创建一个副本,则使用 -b 命令克隆分支并生成一个新分支:

git checkout -b newBranch oldBranch

scmmanager克隆私有仓库,带密码

git clone 参数

git clone http://用户名:密码@URI

其中,http 表示协议,有可能是 https。

用户名:密码@ 可以省略,如果省略则是项目普通的 URL,则会弹出校验。如果带了账户密码参数,则不再需要输入。

git clone http://uname:pass@localhost:8080/scm/git/demo

不带账户名、密码时则如下:

git clone http://localhost:8080/scm/git/demo

php exec函数 执行外部程序

exec 用于执行外部程序。

语法如下:

exec(string $command, array &$output = null, int &$result_code = null): string|false

第一个参数,是命令,格式为字符串。

第二个命令,为命令输出后的结果,如果传递了变量,则该变量将指向返回结果,也就是用它获取返回值,第三个参数表示命令执行的状态码,如果设置了变量,则也被自动指向到命令结果状态码,一般为0时表示命令正常执行。

例子:执行 git log 命令

exec("git log",$output,$ret);

var_dump($output);  // 输出的结果数组
var_dump($ret);  // 0 ,表示命令正确执行

php 无法执行 system,exec函数

修改php配置文件,也就是 php.ini ,

在 disable_functions 中去掉想开放的函数即可。

例如取消 exec:

disable_functions = passthru,system,chroot,chgrp,chown,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

只要在 disable_functions 中删除该函数名,并重启 php 即可。

PHP 金额表达式注入

php 的弱类型,有可能被表达式金额注入。

正常金额应该是整数或小数。如果传递一个表达式,如: +300*-1,则可能造成表达式攻击。

if($user['money'] < $amount){
    return build_err("余额不足");
}

上面的校验,如果 $amount 是一个表达式,则该校验会校验通过,从而跳过校验造成攻击。

最简单的解决办法,就是直接 float 一下。

php parse_url函数解析url

更新版本:(PHP 4, PHP 5, PHP 7, PHP 8)

解析一个 URL并返回各个组成部分。语法:

parse_url(string $url, int $component = -1): int|string|array|null|false

此函数解析 URL 并返回一个关联数组,其中包含存在的 URL 的任何各种组件。数组元素的值未经过 URL 解码。

这个函数并不意味着验证给定的 URL,它只是将它分解成下面列出的部分。部分和无效的 URL 也被接受, parse_url() 会尽力正确解析它们。

component参数:

指定 PHP_URL_SCHEME、PHP_URL_HOST、PHP_URL_PORT、PHP_URL_USER、PHP_URL_PASS、PHP_URL_PATH、PHP_URL_QUERY 或 PHP_URL_FRAGMENT 之一以仅检索特定的 URL 组件作为字符串(除非给出 PHP_URL_PORT,在这种情况下,返回值将是一个 int)。

返回值说明:

在严重格式错误的 URL 上,parse_url() 可能返回 false。

如果省略 component 参数,则返回关联数组。至少一个元素将出现在数组中。此数组中的潜在键是:

  • scheme – e.g. http
  • host
  • port
  • user
  • pass
  • path
  • query – after the question mark ?
  • fragment – after the hashmark #
  • 如果指定了 component 参数,则 parse_url() 返回一个字符串(或一个 int,在 PHP_URL_PORT 的情况下)而不是一个数组。如果请求的组件在给定的 URL 中不存在,将返回 null。从 PHP 8.0.0 开始, parse_url() 区分不存在和空的查询和片段:
http://example.com/foo → query = null, fragment = null
http://example.com/foo? → query = "",   fragment = null
http://example.com/foo# → query = null, fragment = ""
http://example.com/foo?# → query = "",   fragment = ""

前面所有情况都导致查询和片段为空。

请注意,组件中的控制字符(参见 ctype_cntrl())被替换为下划线 (_)。

例如以下代码:

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>

运行结果:

array(8) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"

从数组转换为URL字符串的方法,例子:

<?php

$url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment';
if ($url === unparse_url(parse_url($url))) {
  print "YES, they match!\n";
}

function unparse_url($parsed_url) {
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return "$scheme$user$pass$host$port$path$query$fragment";
}

?>