给定一个文件,我可以检查git repo的历史记录中是否存在相同的文件吗?

时间:2019-06-23 21:58:09

标签: git

给出一个带有文件foo.c和任意文件的git存储库,我可以检查给定文件在存储库中是否存在与foo.c相同的内容吗?

也就是说,给定文件foo.c的某个副本,我想检查存储库中是否存在这样的(按字节顺序相同)foo.c

3 个答案:

答案 0 :(得分:1)

使用public class OpenGLRenderer implements GLSurfaceView.Renderer { private Context _context; private FloatBuffer vertexBuffer; private ShortBuffer drawListBuffer; private int positionHandle, program, colorHandle; static final int COORDS_PER_VERTEX = 3; static float squareCoords[] = { -0.5f, 0.5f, 0.0f, // top left -0.5f, -0.5f, 0.0f, // bottom left 0.5f, -0.5f, 0.0f, // bottom right 0.5f, 0.5f, 0.0f }; // top right private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices float color[] = {0.5f, 0.5f, 0.55f, 1.0f}; private int vertexCount; private int vertexStride; // 4 bytes per vertex public OpenGLRenderer(Context context, String colorStr){ super(); _context = context; color = new float[]{(float)Integer.valueOf( colorStr.substring( 1, 3 ), 16 ) / 256.0f, (float)Integer.valueOf( colorStr.substring( 3, 5 ), 16 ) / 256.0f, (float)Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) / 256.0f, 1.0f}; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES20.glClearColor(1f,0f,0f,1f); ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4); bb.order(ByteOrder.nativeOrder()); vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(squareCoords); vertexBuffer.position(0); // initialize byte buffer for the draw list ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2); dlb.order(ByteOrder.nativeOrder()); drawListBuffer = dlb.asShortBuffer(); drawListBuffer.put(drawOrder); drawListBuffer.position(0); vertexCount = squareCoords.length / COORDS_PER_VERTEX; vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex GLES20.glEnable(GLES20.GL_SCISSOR_TEST); compileShaders(); sendData(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0, 0, width, height); GLES20.glScissor(0,0, width, height); } @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer); GLES20.glDisableVertexAttribArray(positionHandle); } private void sendData(){ positionHandle = GLES20.glGetAttribLocation(program, "position"); GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); colorHandle = GLES20.glGetUniformLocation(program, "vColor"); GLES20.glUniform4fv(colorHandle, 1, color, 0); } private void compileShaders() { int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); GLES20.glShaderSource(vertexShader, getShaderSource(R.raw.vertex_shader)); int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); GLES20.glShaderSource(fragmentShader, getShaderSource(R.raw.fragment_shader)); GLES20.glCompileShader(vertexShader); GLES20.glCompileShader(fragmentShader); program = GLES20.glCreateProgram(); GLES20.glAttachShader(program, vertexShader); GLES20.glAttachShader(program, fragmentShader); GLES20.glLinkProgram(program); GLES20.glUseProgram(program); } private String getShaderSource(int input){ StringBuilder total = new StringBuilder(); try{ InputStream stream = _context.getResources().openRawResource(input); BufferedReader r = new BufferedReader(new InputStreamReader(stream)); total = new StringBuilder(); for (String line; (line = r.readLine()) != null; ) { total.append(line).append('\n'); } } catch (IOException e){ System.out.println(e.getMessage()); } return total.toString(); } } git log --all -- foo.c查找文件。然后,您可以将git repo中的哈希与git rev-list --all | xargs -I '{}' git ls-tree --full-tree -r '{}' | grep 'foo.c'进行比较,并将文件系统中的哈希与git ls-files -s foo.c进行比较,以确保它是相同的文件。

答案 1 :(得分:1)

当然。 git log --raw会在每条更改的路径上显示新旧sha,也许最简单的输出是来自

git log --raw --no-abbrev --all -m --pretty=format:%H

在那寻找你的影子。

如果“文件foo.c的某些副本”表示您不一定要将该foo.c添加到存储库中,则可以使用例如git hash-object foo.c,否则git rev-parse可以搜寻任何现有ID。

类似

git log --raw --no-abbrev --all -m --pretty=format:%H \
| awk 'NF==1 {commit=$1} $4==thehash{print commit,$0}' thehash=`git hash-object foo.c`

答案 2 :(得分:1)

一种简单的方法是:

git cat-file -t $(git hash-object path/to/foo.c)`  # Assuming bash syntax...

如果已将与blob字节相同的任何文件提交到存储库,则将打印foo.c(无论文件路径/名称如何), 以及fatal: git cat-file: could not get object info(如果它不在仓库中)。

它计算输入文件path/to/foo.c的sha-1哈希,然后查询由该哈希标识的git-object的类型,如果git中不存在该文件,则将产生错误消息对象数据库。

缺点是它只是回答存储库中是否存在文件的问题。
它不会告诉您匹配文件的路径,也不会告诉您包含该匹配文件的提交/提交。