iOS获取App ipa包以及资源文件

LINK:https://www.jianshu.com/p/fdb50d303ad6

要获得线上APP的ipa文件,现在有以下几种方案
1.通过PP助手下载安装到手机的应用
2.通过iTools助手下载安装到手机的应用
3.通过Apple Configurator 2(Mac商店)获取
前两种方案网上的教程很多,这里只介绍第三种方案

首先 去Mac上的App Store下载Apple Configurator 2。
然后把iphone连接上Mac,点击Apple Configurator 2 菜单中->账户->登陆(用连接设备的Apple ID)

打开登录.png

备份iPhone的内容(避免数据丢失,非必选)

所有设备->选中当前iPhone->添加->应用,找到您想要ipa的那个应用->添加

添加应用.png

添加.png

下载ipa包中.png
因为你手机中已经存在了当前应用,所以会提示,该应用已经存在, 是否需要替换?
此时,不要点任何按钮!不要点任何按钮!不要点任何按钮!

不要点击任何按钮.png
不要操作Apple Configurator 2,让它保持上图的状态,然后打开Finder前往文件夹,或者直接快捷键command+shift+G
并输入下面路径
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

前往文件夹.png

前往文件夹2.png
点击前往,打开ipa包所在文件。将ipa文件copy出来。

获取ipa包所在文件夹.png
这时候别忘了点击Apple Configurator 2窗口中的停止,你会发现刚才目录下的文件也消失了

拿到ipa文件后,你可以将后缀.ipa改为.zip,然后解压


修改文件类型.png

就可以看到Payload下的包,显示包内容可以看到部分APP的资源以及Assets.car。

解压.png
如果你要解压Assets.car, 可以使用github上的工具https://github.com/pcjbird/AssetsExtractor

最后,提取出来的资源文件,大家要注意版权,仅供参考,不要直接拿来商业使用。

11/13/2018 12:58 下午 posted in  杂七杂八

InHouse 下载

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>items</key>
        <array>
            <dict>
                <key>assets</key>
                <array>
                    <dict>
                        <key>kind</key>
                        <string>software-package</string>
                        <key>url</key>
                        <string>https://www.xt.top/folder/xtoken-1.0.ipa</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>full-size-image</string>
                        <key>needs-shine</key>
                        <true/>
                        <key>url</key>
                        <string>https://www.xt.top/folder/images/icon.57x57.png</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>display-image</string>
                        <key>needs-shine</key>
                        <true/>
                        <key>url</key>
                        <string>https://www.xt.top/folder/images/icon.512x512.png</string>
                    </dict>
                </array>
                <key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>com.biyuan.xtoken</string>
                    <key>bundle-version</key>
                    <string>1.0</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>title</key>
                    <string>XToken</string>
                </dict>
            </dict>
        </array>
    </dict>
    </plist>

然后把 .ipa 和 .plist 文件都上传到支持HTTPS协议的服务器,在网页源码里写入:

<a href="itms-services://?action=download-manifest&url=https://s3-us-west-2.amazonaws.com/folder/appName-version.plist" id="text">Install the In-House App</a> 
07/25/2018 13:35 下午 posted in  杂七杂八

iOS程序员如何使用python写网路爬虫

转载于:http://www.jianshu.com/p/b87413a9307e

iOS程序员如何使用python写网路爬虫
我上一篇blog说过,iOS开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是python.
原因就是
1.语法简单
2.库太多,随便想要什么功能的库都找得到,简直编程界的哆啦A梦.
3.语法优美,不信?你去看看python超过两千行的代码再回头看看用oc写的超过两千行的代码,oc写的简直丑到极致(没命名空间,点语法调用和括号调用混用).

##为什么要会写爬虫?
春节前有一件活无人认领,我就自告奋勇认领了,具体如下:

自己写程序在豆瓣读书上抓取人
熊节觉得一个好的程序员应该读过那20本好书 ——《重构》《精益创业》《敏捷软件开发》《测试驱动开发》等等。他在为ThoughtWorks组建成都分公司团队的时候,发愁正统招聘方法太慢了。于是,他花了几个晚上用自己高中自学的水货代码水平写了一个程序,去抓取豆瓣上读过这些技术书籍的人。然后不断递归,再抓到这些人都读过其它什么书,再继续抓读过那些书的人。抓了几万人之后,他再用Hadoop来分析,筛选出了几十个技术大牛。

他把这些大牛的豆瓣账号扔给了公司女HR,让HR去一个个发豆邮勾搭。
春节期间断断续续边看边学写了个爬豆瓣上优秀iOS开发人员的爬虫.所以感觉iOS开发人员有必要掌握这项技术.

再举个例子,你如果想自己弄个app,例如每日精选美女之类的app,你服务端总得有图吧,怎么弄?自己用爬虫爬啊,爬到链接了塞到数据库里,传个json,app直接sdwebimage就好了.多爽!

废话不多说.开始写.

我先假设你用的是mac,然后mac都预装了python2.x,然后呢,你有了python没用,你得有库.没库怎么干活?怎么安装库呢?python界也有个类似于我们iOS开发里cocoapods的东西,这个东西叫做pip.

pip和cocoapods用起来的命令都极其类似,我们只需要两个库,一个叫做urllib2,一个叫做beautifulsoup.

urllib2是干什么的呢?它的作用就是把网页down下来,然后你就可以分析网页了.

beautifulsoup干什么的呢?你用urllib2把网页down下来了之后,里面都是html+css什么的,你想要从乱七八糟的一堆html里面找到正确的图片链接那可不是件简单的事,据我这几天的学习,做法无非两个,一个是自己写正则表达式然后用一个叫re的python库,另一个是使用lxml解析xpath.这两个说实话都不太好用,一个正则就够你吃一壶的.后来我搜索了很久,发现了一个库叫做beautifulsoup,用这个库解析html超级好用.

然后你们打开terminal敲入下面这个命令.

pip install BeautifulSoup

然后就会自动帮你安装BeautifulSoup这个东西了.urllib2因为是自带的,所以不用你下载了.

好的我们打www.dbmeizi.com,这个邪恶的网站,首页都是软妹子.直接右键打开源文件.

你看到的是这些东西.

看上去和乱码没什么区别,但是我们需要仔细观察.终于找到了图片的链接.

图片链接就在li这个标签下地img标签里.现在我们需要做的就是尝试着把这种类型的li从所有html中分离出来.我们可以看到li这个标签有个属性叫做class,这个属性的值是class="span3",我们把这段话li class="span3"
搜索一下,我们发现有20个结果.恰巧,我们这个页面的图片也只有20个,那么可以确定的是我们找到了区别于其他标签的唯一性.

再仔细分析下,img这个标签在li这个标签里有且只有一个.那么,也就是说,我们先搜索出所有符合条件的li标签,然后找到里面的img标签就可以找到所有的图片链接了.

然后看代码.

#!/usr/bin/python
#-*- coding: utf-8 -*-
#encoding=utf-8

import urllib2
import urllib
import os
from BeautifulSoup import BeautifulSoup
def getAllImageLink():
    html = urllib2.urlopen('http://www.dbmeizi.com').read()
    soup = BeautifulSoup(html)

    liResult = soup.findAll('li',attrs={"class":"span3"})

    for li in liResult:
        imageEntityArray = li.findAll('img')
        for image in imageEntityArray:
            link = image.get('data-src')
            imageName = image.get('data-id')
            filesavepath = '/Users/weihua0618/Desktop/meizipicture/%s.jpg' % imageName 
            urllib.urlretrieve(link,filesavepath)
            print filesavepath 

if __name__ == '__main__':
    getAllImageLink()
    

我们来一句一句分析下.其实python的语法超级简单.
凡是#打头的就是python里面的注释语句类似于oc里的//.
分别说明我们的环境是python,编码是utf-8

然后import了四个库,分别是urllib2,urllib,os,和beautifulsoup库.
导入beautifulsoup库的方式和其他三个不太一样.我暂时也不清楚为什么python用这种导入方式,不过照猫画虎就行了.

然后def打头的就是定义一个函数,python里面是不用分号做句与句的分隔符的.他用缩进来表示.与def缩进一个tab的都是函数体.

html = urllib2.urlopen('http://www.dbmeizi.com').read()

这句很简单,就是读取网页的html.然后把值赋给html这个变量.python里声明变量前面不用加任何东西,不用加声明语句和变量类型,就连javascript声明变量还要加个var呢.
我们获取了网页的html之后呢,声明了一个beautifulsoup变量soup,用来准备解析html.

liResult = soup.findAll('li',attrs={"class":"span3"})

这句话的意思就是,寻找html中所有li标签,并且这个li标签有个属性class,class的值是span3.
注意这个findAll函数,有点常识的话你应该清楚,凡是带all的函数基本上返回的都是一个数组,所以我们liResult这个变量实际上是一个数组.

for li in liResult:

这句话基本和oc里的遍历数组语法完全一样.就是遍历liResult里的每一个变量.那么每一个变量就是一个标签.

imageEntityArray = li.findAll('img')

获得了li标签,我们再找出所有的img标签.
一样的道理,遍历所有img标签(实际上只有一个).

link = image.get('data-src')
imageName = image.get('data-id')

这两句的意思就是,获取img标签里的'data-src'属性和'data-id'属性,data-src就是我们最想要的图片链接了.data-id我们会用来当做下载图片之后的名字.

filesavepath = '/Users/weihua0618/Desktop/meizipicture/%s.jpg' % imageName
urllib.urlretrieve(link,filesavepath)

这两句,第一句是设置一个文件存放地址,第二句用urllib这个库的urlretrieve这个方法下载我们的图片,并且把图片放到刚才的路径里.
092856145A4E2E9A4BE1494A72DD1BF8_ORIG_750_838

好了,我们的图片就下载完了.

说说我是怎么爬虫所有豆瓣ios开发的,我先找到所有标签为ios开发的书籍,然后把所有书的id抓到,然后用id找到所有阅读过书的用户id,把所有用户id抓下来之后用hadoop分析,哪些用户id读过的书最多,列出前一百个.然后,你们懂得...(昨天我的ip还是mac地址已经被豆瓣封了)

我感觉,我可以在简历上郑重的写下"精通python和大数据分析" -_-!

如果你认为这篇文章不错,也有闲钱,那你可以用支付宝扫描下方二维码随便捐助一点,以慰劳作者的辛苦

01/28/2016 08:39 上午 posted in  杂七杂八

国人为什么这么轻视技术?

到处都是“过来人”的谆谆教导我们不要过分重视技术。技术的确不是创业成功的唯一原因,也的确是不能太把技术的重要性过分强调。

国人为什么这么轻视技术?

  网上搜索一下,到处都是“过来人”的谆谆教导我们不要过分重视技术。技术的确不是创业成功的唯一原因,也的确是不能太把技术的重要性过分强调。假如目前国内是一种技术至上的现状,技术人员的地位虚高,那么这些言论的确有助于业内整体的协调发展。但是现状是,目前国内普遍的认识并没有很抬高技术的地位。恰恰相反,技术被过低的估计了其应有的价值,网上强调技术重要性的文章几乎没有。技术人员的地位已经是低得不能再低,在许多公司内部,已经到处都是对技术人员的轻蔑的眼光。在重要的技术几乎都由国外主导,而目前中国已经几乎丧失了任何技术主导权的今天,还在一直继续强调切不可技术主导,将会给国家的IT产业的自强发展造成严重的影响。

  比如今天看到的这篇关于创业团队的思考:切不可技术主导,又是一篇典型文章。其实整篇看下来,作者说的有一定道理,只不过他其实考虑的只是有关Web 2.0网站的创业,却又强扣了一顶技术无用论的大帽子。他的文章标题假如是:“关于Web 2.0网站创业的思考:切不可技术主导”的话,倒也较少可辩驳之处。可惜他文章标题的范围说的是整个创业团队,那这篇文章就完全是在误导人了。

  IT业技术主导创业成功的例子比比皆是,著名的有:

  Borland公司。就只有两个人,谈不上管理,没有资金,没有关系,没有背景,也没有市场,要不是Anders Hejlesberg拥有高超的技术,写出了当时世界上最块的Borland Turbo Pascal编译器,他们怎么成功?他们的创业团队是靠什么主导的?

  ID公司。也只有两穷小子,John Carmark和John Romero。要不是John Carmark利用天才的3D技术写出了Doom,他们怎么成功?他们的创业团队是靠什么主导的?

  微软公司。还是只有两个人。要不是Bill和Allen利用高超的技术,在4K内存的Atali 4004计算机上写出了Basic语言的解释器,他们怎么成功?他们的创业团队是靠什么主导的?

  另外Apple,Oracle,Intel等等著名的公司都有类似的经历。

  你也许会说这些都是以前的例子,现在不会有这种情况。OK,那么现在最红火的Google,他们的几个创始人都是技术沙文主义者,要不是他们能创造出可以支持几亿人同时访问只用毫秒级时间的搜索引擎,他们能成功么?另外,Linux,Firefox,MySQL,JBoss这些东西,哪个创业团队不是靠技术主导成功的?

  最后,我还想知道,对一个创业团队来说,如果你不靠技术主导?那么靠什么主导?

  靠市场主导?刚创业就有市场?你用什么东西占领市场?

  靠管理主导?Come on,我们正在谈论的是“创业”团队,你认为哪个创业团队会有几百号人让你来管理?

  靠Idea?有这种想法的人一般是空想家。就像不会在人群拥挤的大街上捡到一百万一样,容易实现的Idea早被n多人发现并且做了。哪有什么你可以想到别人没有想到的点子。除非你想到并且可以做到的点子别人无法做到。那你在资金,关系,地位什么都没有的情况下,靠什么来拉高这个门槛让别人够不着?我能想到的只有技术。

  靠关系?如果你是国家主席的儿子,那么没什么好谈的了。这篇文章不是给你看的。

  靠钻法律空子,政策空子?这也是需要高超的技术的,你至少在法律政策上要很熟悉。

  偷钱,抢银行?对不起,我认为这还是需要技术,同样是技术主导。
转自:
http://www.testage.net/html/01/n-158101.html

08/10/2015 09:57 上午 posted in  杂七杂八

我为什么讨厌产品经理

转载:我为什么讨厌产品经理
半年前的文章《我为什么讨厌程序员》最近老被拎出来,看着一些评论,开始有些脾气,然后我完整得乐坏了……

先补这一篇,我接下打算写一篇文章,来说明自己为什么智商这么低,这么二……

其实也是奇怪,多数PM看到这样的文章会乐呵呵的看完;而多数的程序员看到另一篇文章,反应却不是这样的?

##理由1,其实想做经理,而不是产品

有人在称赞世界上存在过的伟大的产品经理,同时又有很多人说,“人人都是产品经理”。

想做经理么?产品经理,可真是捷径。不管什么专业出生,不管聪明或者愚蠢,不管年轻或者年老,都可以的事情。

如果2012年12月21号,我可以祈祷某一类人消失的话,毫无疑问,我会选择应届生产品经理。别跟我探讨新牛不下地何以学耕的问题,这个跟本文无关,既然你有勇气认为自己是产品经理,就别用新人为自己找借口。

内心屈辱地承认自己的失败,才会奋起直追。

曾经看到一篇某PM对自己工作“平实”的介绍,大家觉得说得非常厚道。但全文的中心思想不过是按照BOSS的要求做事,以及机械式的做事,并且,没有赚多少钱。

丝毫看不出那种产品人应该具备的价值观、观察世界的能力、唾弃以及热爱;做平庸的产品,然后自认问心无愧,不再有所追求。即使自认还有理想,也不过是一个行将就木的人类,逐步在往更高级别的管理者行进而已。当然,他仍然可能失败。

我曾经面试过一个奇葩产品经理,他居然在考各种管理类的证书…… 奇葩地是在于,他以这样的身份工作了不少年。呃,别吐槽工资低,虽难算高薪,但那次招聘,我们的标的是5位数,接近月入一平。

##理由2,浪费纸张、键盘

虽然没有多少程序员会认真地去阅读产品文档、技术实现文档;但是,这些文档并不是最短命的。

最短命的是BRD、PRD……

求你们了,为了世界和平,省点电吧!

##理由3,满嘴跑火车

有一种PM,动动就说,你的成长空间如何如何,为了你的成长如何如何。看似苦口婆心,但他真在乎么,并且他真的有能力来照顾我的成长空间么?假道学而已。成长靠自己,成功靠勤奋,成事看天,这是常识呀。

还有一种PM,有种天然的绝杀噎死人的逻辑。

问:你觉得我们团队的核心优势是什么?

PM答:我们的优势是积累出来的……

PM还说: 给大家分享一个行业数据,……,这个数据说明,我们现在做的事情,做的市场很大呀!!

路人说: 你的数据哪来的?

PM顿而道: 内部数据,呵呵。

##理由4,强奸数据

数据是最理性。

但处理数据的过程中,有太多水分可以兑进去了。

有时产品上线了一段时间,PM给所有分享运营数据。散会后,我们经常会有这样感觉,我的智商受到了挑战。成交率低,就说下单数还可以;下单数也不灵,就取某冤大头的大笔消费,平均客单价不错哦;跳出率高的时候,死不承认过来的垃圾流量有问题,装一副单纯样,还要继续研究。

##理由5,孬种

全宇宙的SB都知道的不靠谱的某种特性,当然SB PM也知道,只要老板说要这么做;他也不反抗。然后,然后,居然扯出像模像样的原型以及各种文档。

在实施过程中,遇到阻碍的时候,他通常会说,老板的意思是这样,我也没有办法……

当然,孬种PM中还有种类型是人畜无害的,唯唯诺诺,但脾气好。所以,你真的会心疼他……

还有一件事情我无法理解的,为什么有些产品经理竟然以下跪为荣?!解释产品设计的过程,需要跪下么?需要摆这种姿态么?你是如何的弱,才需要做这样的事情?!

Q刚毕业过来的时候,也有这个毛病,觉得这样会亲和很多。我不止一次告诫他,别跪下,蹲下都不可以;话太多,说累了,拉把椅子,没椅子你直接盘坐在地毯上也好啊!

亲,跪下的产品经理,差不多都是装出来的吧!

##理由6,不懂技术还有理了?

本条吐槽无力。

刚入门的时候,人人抱着一本人人都是产品经理,这太让人厌恶了;如果人人抱着xx语言入门,才让人喜爱。如果没点聪明才智,PM能做好?如果有点聪明才智,各种语言的入门时间不过个把月甚至个把礼拜而已。我说的这个,并不是与程序员更好的沟通的前提,而是,对自己事业的尊重。

还有种纯程序员转岗的PM,呃,放过我吧,Project Manager?

##理由7,装逼扮用户

跟产品经理沟通的时候,我最多听到的句子、关键字是 用户不会这么觉得如果我是用户。

如果你是一个男人,你去设计女士内衣。我不会肤浅地认为你不懂女人。你作为一名设计师,你即是产品最大的核心。

但是我非常用心的去观察动不动就以用户为名的PM,根本没有办法把他们和产品以及用户联系在一起。他们更多的时候讨论的是这个按钮是这么颜色,应该放在哪里,文案应该怎么写。讨论这些错了么?当然没有错。错就错在,把这些问题当做了核心问题,并且即使这些交互级的问题,也经常做出令人啼笑皆非的决定来。

不知还有多少人顶着所谓的“产品经理综合症”,常常对生活中各种物品提出自己关于如何重新设计的看法,有茶杯、咖啡机、电梯、电灯、座位怎么安排 .etc, 各种你想的到想不到的问题。讨论这些错了么?当然没有错。错就错在,讨论了这么多年,他们还在讨论这些,公转自转,孜孜不倦!

##理由8,好运的混蛋

知道国内几个大平台上出产的PM,但真人,谈吐所体现出的产品人气息,常常是瞬间就冒出一个疑问,是他们成就了那些平台,还是那些平台成就了他们? 我的答案毫无疑问会选择后者。

但他们身上所体现出来的能力,是另一种非产品人的能力。他们中的多数,不得不佩服。想来想来,只有这个名词好运的混蛋能表达这种爱恨交织的感情了。

但把他们当做纯种的PM来看,呃,那这又是一条足以让人讨厌的理由了。

##最后的绝杀

其实,多数PM的工资,不如多数的程序员高。PM,是一个多么奇葩的岗位。

而且,我们还有一个必杀技,可以直接秒杀PM。你遇到的几乎任何事情,只要咆哮以下这段即可。

这不都是你产品经理应该做的事情么?!

06/11/2015 20:08 下午 posted in  杂七杂八

iOS Crash文件的解析

iOS Crash文件的解析(一)

Andrew->China: Says Hello
Andrew->China: Says Hello1
Note right of China: China thinks\nabout it
China-->Andrew: How are you?
Andrew->>China: I am good thanks!
Title: Here is a title
A->B: Normal line
B-->C: Dashed line
C->>D: Open arrow
D-->>A: Dashed open arrow
st=>start: 开始
e=>end: 结束
op=>operation: 我的操作
op1=>operation: My Operation 
sub1=>subroutine: My Subroutine
cond=>condition: 确认?

st->op->op1->cond
cond(yes)->e
cond(no)->op
st=>start: 预约|past:>http://www.google.com[blank]
e=>end: 结束:>http://www.google.com
op0=>operation: 选择桌型和时间段|past
op1=>operation: 预约信息提交|past
op2=>operation: Stuff|current
op3=>operation: 登陆|current
sub1=>subroutine: My Subroutine|invalid
cond=>condition: 登陆|approved:>http://www.baidu.com
c3=>condition: 数据合法|rejected
c2=>condition: Good idea|rejected
io=>inputoutput: catch something...|request

st->cond
cond(yes, right)->op0(right)->c3(right)
cond(no)->op3
c2(yes)->io->e
c2(no)->op2->e
c3(yes)->op1
c3(no)->op0(right)
05/27/2015 16:59 下午 posted in  杂七杂八

SVN常用知识简介

trunk
tags
branches

##常用SVN 命令:

名词说明:
WC:Working Copy 你的工作区
Versioned:受控的;受版本控制的

  1. svn checkout URL[@REV]... [PATH]
    别名:co
    描述:检出
    访问库:否
    eg:svn checkout file:///var/svn/repos/test  file:///var/svn/repos/quiz working-copies
    eg:svn checkout -r 2 file:///var/svn/repos/test mine  ##check out 版本号为2的项目

  2. svn import [PATH] URL
    别名:无
    描述:导入本地一个目录到库中。但是导入后,本地的目录并不会处于受控状态。
    访问库:是。
    eg:svn import myproj
    http://svn.myProject.com/repos/trunk/misc -m “New import”

  3. svn export [-r REV] URL[@PEGREV] [PATH]
      svn export [-r REV] PATH1[@PEGREV] [PATH2]
    别名:无
    描述:导出一个干净的目录树,不包含所有的受控信息。可以选择从URL或WC中导出。
    访问库:如果访问的是URL则会。
    eg:svn export file:///var/svn/repos my-export   ##导出到my-export目录。

  4. svn status [PATH...]
    别名:stat, st
    描述:输出WC中文件和目录的状态。如果WC提交,这些状态就会同步到库里。
    一般状态有         ‘ ‘  没有修改
    ‘A’  新增
    ‘D’  删除
    ‘M’  修改
    ‘R’  替代
    ‘C’  冲突
    ‘I’  忽略
    ‘?’  未受控
    ‘!’  丢失,一般是将受控文件直接删除导致
    访问库:加上--show-updates参数时会 (查看WC与Versioned的状态对比)
    eg:svn status wc

  5. svn add [path]
    别名:无
    描述:添加文件或目录到你的wc,打上新增标记。这些文件会在下一次你提交wc的时候提交到svn服务器。
    在提交前,你也可以用svn revert撤销新增的文件。
    访问库:否
    eg: svn add file.cpp

svn add xxx@2x.png 文件时, 正常命令 svn add xxx@2x.png 会报 xxx not found
需用 svn add xxx@2x.png@  来添加,也就是图片名字后面再添加一个@ 符号,
这是因为 svn 命令最后需要用@符号来指定一个版本导致的
遇到 xxx@2x.png文件时,如果用svn命令行添加到 版本库的话,只能手动一个一个添加,不能批量添加

  1. svn commit [PATH...]
    别名:ci
    描述:把你WC的更改提交到仓库
    访问库:是
    eg:svn commit -m “added howto section.” ##默认情况下提交必须提供log message 

  2. svn revert PATH...
    别名:无
    描述:还原WC中所有的本地更改。
    访问库:否
    eg:svn revert --depth=infinity .   ##将整个目录所有文件还原

  3. svn update [PATH...]
    别名:up
    描述:更新WC,更新反馈有如下几种分类。
    A  新增
    B  锁破坏
    D  删除
    U  更新
    C  冲突
    G  合并
    E  存在的
    访问库:是
    eg:svn up -r22   ##更新到一个指定版本

  4. svn list [TARGET[@REV]...]
    别名:ls
    描述:显示目标下的文件和目录列表。
    访问库:如果访问的是库地址就会。
    eg:svn list --verbose file:///var/svn/repos   ##--verbose参数表示显示详细信息。

  5. svn delete PATH...
    别名:del,remove,rm
    描述:删除
    访问库:如果PATH是库地址时会,删除WC内的文件不会。
    eg:svn del localfile.cpp    ##删除WC里的文件,在下一次提交WC的时候才会真正在仓库里将对应文件删除。
    eg: svn del file:///var/svn/repos/test/yourfile  ##删除仓库里的文件

  6. svn cleanup [PATH...]
    别名:无
    描述:递归的清理WC中过期的锁和未完成的操作。
    访问库:否
    eg:svn cleanup

  7. svn diff
    别名:di
    描述:用来比较并显示修改点。
    访问库:
    eg:svn diff   ##最常用的方式,用来显示WC基于最近一次更新以后的所有的本地修改点。
    eg:svn diff -r 301 bin ## 比较WC和版本301中的bin目录的修改点
    eg:svn diff -r 3000:3500 file:///var/svn/repos/myProject/trunk   ##比较库里主干3000版和3500版的差异。
    eg:svn diff --summarize --xml http://svn.red-bean.com/repos/test@r2 http://svn.red-bean.com/repos/test  ##--summarize --xml 参数将差异情况以xml文档的方式显示出来。

eg: svn diff -r 1450:1457 ./JoggersV2/JoggersV2/AppDelegate.m

  1. svn log [PATH]
    svn log URL[@REV] [PATH...]
    别名:无
    描述:从库中显示log消息。log消息代码 A :added  D:deleted  M:modified  R:replaced
    访问库:是
    eg:svn log -v http://svn.myProject.com/repos/test/ foo.c bar.c   ##详细显示指定URL的库中foo.c和bar.c所有版本的log信息。
    eg:svn log -r 14:15    ##显示当前WC的14和15版本log信息。
    eg:##如果版本号不连续,只能采用如下方式。
    $ svn log -r 14 > mylog
    $ svn log -r 19 >> mylog
    $ svn log -r 27 >> mylog

  2. svn resolve PATH...
    别名:无
    描述:将冲突的文件标记为已解决,并且删掉冲突产生的临时文件。注意这个命令并不是能把冲突解决,解决冲突还是得靠人工。
    访问库:否
    eg:svn resolve --accept mine-full foo.c   ##1.5版本后,加上--accept参数,尝试自动处理冲突。

2)export
描述:创建一个无版本记录的拷贝
简写:ex

示例:
打开终端,cd 进入到要保存工程的目录(此处一个文件名为project)
cd /Users/hupu/Desktop/project

svn export 项目SVN地址

创建一个无版本记录的拷贝.
svn export –r rev URL path
从项目仓库的指定URL导出一个干净的目录树到path中,如果指定了rev参数,导出rev版本的,否则到处最新版本。
3)import
描述:提交一个无版本的文件或者树到项目仓库
svn import path URL

svn commit -m ‘refs# modify’

打开终端,cd 进入到需要上传的.a文件所在的文件夹。 确保 ls能看到.a文件
hupudeiMac:Support hupu$ cd /Users/hupu/Desktop/HP_Project/Joggers/tags/JoggersV2_1.6.0/Support/MTA
hupudeiMac:MTA hupu$ svn add *.a
A (bin) libmtasdk.a

提交命令:
hupudeiMac:tags hupu$ svn ci -m ‘refs# lib submited’

查看本地和远程修改文件的状态命令:svn st --show-updates

常用命令

打开终端,进到所在的目录,然后出入一下代码
find . -name “.svn” | xargs rm -Rf

  1. 将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
  2. 往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
    svn add xxx@2x.png 文件时, 正常命令 svn add xxx@2x.png 会报 xxx not found
    需用 svn add xxx@2x.png@  来添加,也就是图片名字后面再添加一个@ 符号,
    这是因为 svn 命令最后需要用@符号来指定一个版本导致的
    遇到 xxx@2x.png文件时,如果用svn命令行添加到 版本库的话,只能手动一个一个添加,不能批量添加
  3. 将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
  4. 加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
  5. 更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
  6. 查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
  7. 删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
  8. 查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
  9. 查看文件详细信息
svn info path
例如:svn info test.php
  10. 比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
  11. 将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
  12. SVN 帮助
svn help
svn help ci
  13. 版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
  14. 创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH…
###2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
    15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
    16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
    17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
    18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
    19、配置忽略文件 vi ~/.subversion/config
    找到 global-ignores 一行,去掉注释,编辑成
global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*
找到 enable-auto-props = yes 把注释去掉,在[auto-props] Section声明以下文本文件
*.mode* = svn:mime-type=text/X-xcode
*.pbxuser = svn:mime-type=text/X-xcode
*.perspective* = svn:mime-type=text/X-xcode
*.pbxproj = svn:mime-type=text/X-xcode

=========================================

##svn 出错信息总汇

-svn 出错信息总汇 . Subversion 错误信息一览表 注意: 不同的客户端(命令行,TortoiseSVN, AnkhSVN, Subclipse等)的出错信息可能稍有不同。 下面表格中的出错信息以 http://svn.moon.ossxp.com/svn/test 版本库做示例,仅供参考。 编号 出错信息 问题剖析 解决方案 1. svn: Server sent unexpected return value (500 I-
svn 出错信息总汇 . Subversion 错误信息一览表
注意:

不同的客户端(命令行,TortoiseSVN, AnkhSVN, Subclipse等)的出错信息可能稍有不同。
下面表格中的出错信息以 http://svn.moon.ossxp.com/svn/test 版本库做示例,仅供参考。
###编号出错信息,问题剖析解决方案
 
1.
svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS request for ‘http://svn.moon.ossxp.com/svn/test'

错误的用户名
检查登录的用户名是否输入错误

svn: 服务器发送了意外的返回值(500 Internal Server Error),在响应 “OPTIONS” 的请求 “http://svn.moon.ossxp.com/svn/test” 中

2.
svn: OPTIONS of ‘http://svn.moon.ossxp.com/svn/test': authorization failed: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)

错误的口令
用正确的用户名/口令登录

svn: 方法 OPTIONS 失败于 “http://svn.moon.ossxp.com/svn/test”: 认证失败: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)

3.
svn: Server sent unexpected return value (403 Forbidden) in response to OPTIONS request for ‘http://svn.moon.ossxp.com/svn/test'

用户无权限
联系管理员,为用户分配权限 
svn: 服务器发送了意外的返回值(403 Forbidden),在响应 “OPTIONS” 的请求 “http://svn.moon.ossxp.com/svn/test” 中
 
4.
svn: OPTIONS of ‘http://www.moon.ossxp.com/svn/test': 200 OK (http://www.moon.ossxp.com)

服务器地址错误,是普通Web页面,不支持SVN的 WebDAV 协议

确认输入正确的 SVN 服务地址。可以在浏览器中输入该地址进行确认
 
svn: 方法 OPTIONS 失败于 “http://www.moon.ossxp.com/svn/test”: 200 OK (http://www.moon.ossxp.com)
 
5.
The version of your subversion (client) is below 1.5.0, upgrade to 1.5.0 or above. SVN below 1.5.0 can not handle mergeinfo properly. It can mess up our automated merge tracking!

是由于客户端的软件版本低于1.5.0造成的。服务器端对客户端软件版本进行了限制,以免对合并跟踪破坏。

升级本地的Subversion客户端软件到1.5.0或以上版本。
 
6.
svn: This client is too old to work with working copy ‘.’. You need to get a newer Subversion client, or to downgrade this working copy. See http://subversion.tigris.org/faq.html#working-copy-format-change for details.

安装了多个版本的SVN客户端(TSVN,Subclipse,...),且各个客户端的版本不一致。高版本的SVN客户端会自动更新本地工作目录中的 .svn 目录下的文件格式,导致旧版本的SVN客户端不能继续访问该本地工作目录

将本机安装的所有的SVN客户端都更新到同一个大版本,以避免本地工作目录的格式不一致
-svn: 此客户端对于工作副本 . 太旧。你需要取得更新的 Subversion 客户端,或者降级工作副本。 参见 http://subversion.tigris.org/faq.html#working-copy-format-change 以获得更详细的信息。 7. svn: Working cop-

svn: 此客户端对于工作副本 “.” 太旧。你需要取得更新的 Subversion 客户端,或者降级工作副本。 参见 http://subversion.tigris.org/faq.html#working-copy-format-change 以获得更详细的信息。

7.
svn: Working copy ‘trunk/src’ locked svn: run ‘svn cleanup’ to remove locks (type ‘svn help cleanup’ for details)

异常操作导致目录没有解锁。
一个简单的重现方法:在 .svn 目录下创建空的名为 lock 的文件

使用命令行 “svn cleanup” 或者类似的“清理”动作删除锁定

svn: 工作副本“trunk/src”已经锁定 svn: 运行“svn cleanup”删除锁定 (输入“svn help cleanup”得到用法)
 
8.
日志中没有作者信息: ------------------------------------ r9 | (没有作者信息) | … ossxp.com anonymous commit test
匿名提交导致没有作者信息
检查版本库权限控制,禁止匿名提交
 
9.
正在发送 ... 传输文件数据.svn: 提交失败(细节如下): svn: Commit blocked by pre-commit hook (exit code 1) with output: 提交说明至少应包含 4 个字符, 或者太简单了。

这是由于用户提交的提交说明(commit log),太过简单了。在提交时需要输入有意义的 commit log。

写有意义的提交说明,或者请求管理员更改版本库插件
10.
增加 Logger.c 传输文件数据.svn: 提交失败(细节如下): svn: Commit blocked by pre-commit hook (exit code 1) with output: Wide character in print at /opt/svn/svnroot/myrepos/hooks/scripts/check-case-insensitive.pl line 259. 发现文件名大小写冲突: trunk/src/Logger.c 已经存在于 logger.c

管理员设置了对新增文件是否重名(只有大小写不同)的文件进行检查。文件名只有大小写不同,在Windows上进行检出会造成麻烦

不要添加重名(仅大小写不同)文件

增加 src/文件aBc.txt 传输文件数据.svn: 提交失败(细节如下): svn: Commit blocked by pre-commit hook (exit code 1) with output: Clash: ‘/trunk/src/文件aBc.txt’ ‘/trunk/src/文件abc.txt’

11.
svn: While preparing ‘/home/jiangxin/tmp/svn.test/trunk/src/README.txt’ for commit svn: Inconsistent line ending style

提交的文件已经设置了 svn:eol-style 属性,但是该文本内的换行符有DOS的换行符CRLF,也有Unix换行符LF,不一致!

统一该文本文件内的换行符。Linux 下可以用dos2unix, unix2dos, sed等命令。Windows下可用 UltraEdit 进行转换。
 
svn: 当为提交操作准备“/home/jiangxin/tmp/svn.test/trunk/src/README.txt”时 svn: 不一致的行结束样式
12.
svn: Failed to add file ‘Makefile’: an unversioned file of the same name already exists

执行更新(svn up)时报错。因为其他人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)

先将本地重名文件改名,再执行 “svn up”,之后再比较、合并文件。或者执行 “svn up --force”
-svn: 增加文件 ‘Makefile’ 失败: 同名未版本控制的文件已存在 13. Adding src/Makefile svn: Commit failed (details follow): svn: File ‘/svn/test/trunk/src/Makefile’ already exists 添加新文件,提交时报错。-
svn: 增加文件 ‘Makefile’ 失败: 同名未版本控制的文件已存在
 
13.
Adding src/Makefile svn: Commit failed (details follow): svn: File ‘/svn/test/trunk/src/Makefile’ already exists

添加新文件,提交时报错。因为其他人已经先于我增加了该文件。

先执行更新操作(”svn up”),再根据提示进行操作:合并/提交...

增加 src/Makefile svn: 提交失败(细节如下): svn: 文件“/svn/test/trunk/src/Makefile”已存在
 
14.
$ svn up Conflict discovered in ‘Makefile’. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p C Makefile Updated to revision 5. Summary of conflicts: Text conflicts: 1
多人同时编辑同一个文件时,可能会遇到冲突。别人先于我提交,则当我提交时要先更新。更新可能遇到不能自动解决的冲突

使用工具进行冲突解决


$ svn up 在 “Makefile” 中发现冲突。 选择: (p) 推迟,(df) 显示全部差异,(e) 编辑, (mc) 我的版本, (tc) 他人的版本, (s) 显示全部选项: p C Makefile 更新到版本 5。 冲突概要: 正文冲突:1
 
15.
svn: Commit failed (details follow): svn: File ‘Makefile’ is out of date svn: File not found: transaction ‘6-d’, path ‘/trunk/src/Makefile’

提交的文件已被他人删除

先执行更新操作(”svn up”),再根据提示解决该树冲突:删除文件或继续添加...

svn: 提交失败(细节如下): svn: 文件 “Makefile” 已经过时 svn: File not found: transaction ‘6-c’, path ‘/trunk/src/Makefile’

16.
svn: Commit failed (details follow): svn: File or directory ‘/trunk/XXX’ is out of date; try updating svn: resource out of date; try updating

基于旧版本修改是不允许的
先更新(”svn update”),再提交 
svn: 提交失败(细节如下): svn: 文件或目录 “/trunk/XXX” 已经过时;请先更新 svn: resource out of date; try updating

17.
svn: DAV request failed; it’s possible that the repository’s pre-revprop-change hook either failed or is non-existent svn: At least one property change failed; repository is unchanged svn: Error setting property ‘log’: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook

修改提交说明等操作属于高风险操作,因为该操作没有被版本控制,属于不可恢复的操作。缺省禁止。

请联系管理员,启用该版本的相关钩子,允许修改“版本属性”。参见 管理员钩子设置


svn: DAV 请求失败;可能是版本库的 pre-revprop-change 钩子执行失败或者不存在 svn: 至少有一个属性变更失败;版本库未改变 svn: 设置属性 “log” 出错: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook

05/08/2015 08:39 上午 posted in  杂七杂八

Markdown 11种基本语法

  1. 标题设置(让字体变大,和word的标题意思一样)
    在Markdown当中设置标题,有两种方式:
    第一种:通过在文字下方添加“=”和“-”,他们分别表示一级标题和二级标题。
    第二种:在文字开头加上 “#”,通过“#”数量表示几级标题。(一共只有1~6级标题,1级标题字体最大)

  2. 块注释(blockquote)
    通过在文字开头添加“>”表示块注释。(当>和文字之间添加五个blank时,块注释的文字会有变化。)

  3. 斜体
    将需要设置为斜体的文字两端使用1个“*”或者“_”夹起来

  4. 粗体
    将需要设置为斜体的文字两端使用2个“*”或者“_”夹起来

  5. 无序列表
    在文字开头添加(, +, and -)实现无序列表。但是要注意在(, +, and -)和文字之间需要添加空格。(建议:一个文档中只是用一种无序列表的表示方式)

  6. 有序列表
    使用数字后面跟上句号。(还要有空格)

  7. 链接(Links)
    Markdown中有两种方式,实现链接,分别为内联方式和引用方式。
    内联方式:This is an
    example link.
    引用方式:
    I get 10 times more traffic from [Google][1] than from [Yahoo][2] or [MSN][3].

[1]: http://google.com/ “Google”
[2]: http://search.yahoo.com/ “Yahoo Search”
[3]: http://search.msn.com/ “MSN Search”

  1. 图片(Images)
    图片的处理方式和链接的处理方式,非常的类似。
    内联方式:![alt text](/path/to/img.jpg “Title”)
    引用方式:

![alt text][id]

[id]: /path/to/img.jpg “Title”

  1. 代码(HTML中所谓的Code)
    实现方式有两种:
    第一种:简单文字出现一个代码框。使用<blockquote>。(不是单引号而是左上角的ESC下面~中的
    第二种:大片文字需要实现代码框。使用Tab和四个空格。

  2. 脚注(footnote)
    实现方式如下:
    hello1

  1. 下划线
    在空白行下方添加三条“-”横线。(前面讲过在文字下方添加“-”,实现的2级标题)

References:

以上内容根据官方文档基本文档进行整理。http://daringfireball.net/projects/markdown/basics
Markdown官方网站:http://daringfireball.net/projects/markdown/

推荐一款在线的Markdown编辑器:https://stackedit.io/

  1. hi

04/20/2015 12:28 下午 posted in  杂七杂八