Cómo verificar la date de creación del file con github api

Estoy usando la aplicación github para capturar el contenido de los files , pero también me gustaría ver cuándo se crearon los files. ¿Hay alguna manera de get esa información con la API Github?

Git no almacena las dates de creación de files (en un sentido significativo, los files de Git no tienen dates de creación). De todos modos, puede get algo útil para usted, pero la interfaz de GitHub lo está llevando en la dirección incorrecta.

Si examina la operación "crear un file" lo suficientemente cerca y está familiarizado con Git, se dará count de que realmente no crea un file en absoluto: en su lugar, realiza una nueva confirmación . Es por eso que necesita un post de compromiso y permite un autor y un committer.

Lo que esto significa es que debe encontrar una confirmación que contenga el file y luego recuperar la información sobre esa confirmación . El problema aquí es doble:

  • encontrar una confirmación que contenga el file , y
  • definiendo lo que quieres decir con "creado" .

Para encontrar una confirmación, necesita un hash de confirmación (SHA-1 ID). El lugar principal para get un hash de confirmación es a partir de un compromiso. Por lo tanto, necesitará un hash de confirmación para encontrar un hash de confirmación. Esto es, por supuesto, un problema.

Para romper el punto muerto aquí, debes comenzar buscando una reference . Una reference es simplemente un nombre que está emparejado con un hash de objects Git, a menudo, pero no siempre, un hash de un object de commit . A continuación, usa esa reference para localizar una confirmación: si la reference apunta directamente a una confirmación, estás ahí; si apunta a una label (un object de label anotado), usted lee el object de label, que contiene otra ID de hash. Siga leyendo estos objects hasta que llegue a algo que no sea una label. Si eso es un commit, has tenido éxito. Si se trata de un tree o una burbuja, la label no lleva a una confirmación en primer lugar y probablemente no le interese.

La reference con la que desea comenzar es la misma reference que ha estado utilizando para recuperar el file.

Ahora que tiene una ID de confirmación y puede recuperar la confirmación, es hora de ver si el file en cuestión incluso existe en esa confirmación. Es de suponer que existe esa confirmación particular, ya que ha estado recuperando el file. Pero es posible que el file no se haya creado en esa confirmación: puede que simplemente se haya transferido de una confirmación anterior.

Si, por "creado", quiere decir "¿cuándo se creó la confirmación más reciente? ", Puede detenerse aquí: get la confirmación y usar la date del autor y / o la date del autor. Sin embargo, si te refieres a "encontrarme un compromiso donde en alguna confirmación anterior , el file no existe", debes hacer mucho más trabajo. Ahora debe recuperar el object de tree asociado con cada confirmación , para ver si existe alguna $path file como foo/bar.txt en esa confirmación concreta (la otra API que ha estado utilizando solo recupera files de la mayoría comprometerse en una reference dada).

Tenga en count que cada commit puede tener más de un padre . Esto ocurre para las asignaciones de fusión. La mayoría de estos commits tienen exactamente dos padres, pero cualquier número superior a 1 es posible. Al observar una combinación de fusión que contiene alguna ruta de file $path , cada uno de sus (múltiples) padres también puede tener file $path o care file $path . Aquí es donde "definir lo que quieres decir con creado" se vuelve particularmente difícil.

  • Para una confirmación sin padres (una confirmación de raíz), claramente el file foo/bar.txt se "crea" aquí si existe.
  • Para un commit con un padre, claramente el file foo/bar.txt se "crea" si foo/bar.txt existe en este commit, pero no en el padre de este commit.
  • Para un commit con dos o más padres, claramente el file foo/bar.txt se "crea" si foo/bar.txt existe en este commit, pero no en ninguno de sus padres.
  • Pero para un commit con dos o más padres, si foo/bar.txt existe en este commit y algunos pero no todos los padres, ¿el file es "creado"?

Una vez que resuelves este problema, estás listo para comenzar, con algunas advertencias menores. En primer lugar, la interfaz API "get un tree" impone límites, por lo que para treees más grandes, debe clonar el repository. Segundo, el trabajo involucrado en hacer esto es, en general, lo mismo que clonar el repository: básicamente estás reimplantando a Git. También podrías usar Git.

El punto final commits se puede filtrar a través del parámetro path , de modo que solo devuelva commits que toquen la ruta determinada. A less que quieras complicarte y hacer varias requestes para seguir movimientos / renombrados de files, solo usaría la date de compromiso de la confirmación más lejana devuelta.